c# - 移植出队 - 添加从 C# 到 F# 的循环

标签 c# f#

我正在尝试移植这个简单的循环:

    var messages = new List<string>();
    while (_MessageQueue.TryDequeue(out var message))
        messages.Add(message);

其中消息队列是并发的。它用在一个模块中,该模块将来自多个线程的消息排入队列,然后由单个线程处理。

是否有惯用的 F# 方法来执行出列/添加循环?

最佳答案

F# 有几种实现并发的方法,包括对 agent-based programming 的良好支持。 ,因此您正在做的事情的惯用 F# 版本很可能不会实际使用 conrrent 队列,而是基于代理或其他一些体系结构。

但是,要回答有关循环的具体问题 - 由于巧妙地使用了 whileout var,C# 版本非常简洁。在 F# 中,您可以调用 TryDequeue 作为返回 bool 和值的方法(这样我们可以避免突变)。我会将其与递归序列表达式一起使用:

let mq = System.Collections.Concurrent.ConcurrentQueue<int>()

let rec readAll () = seq {
  let succ, msg = mq.TryDequeue() 
  if succ then
      yield msg
      yield! readAll() }

let messages = readAll() |> List.ofSeq

readAll 函数定义了一个调用 TryDequeue 的序列 (IEnumerable),如果操作成功,它将消息添加到结果中,使用yield msg,然后使用 yield! 递归尝试读取更多消息。

关于c# - 移植出队 - 添加从 C# 到 F# 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984552/

相关文章:

function - F#:如何定义一个函数来将 2 个 float 相加?在函数签名中指定 "Float"?

c# - Markdown 清晰地将我的 html 字符串包装在 "p"元素中?

c# - Unity 后处理 PostProcessEffectRenderer 显示在编辑器中但不在构建中

c# - 如何从此查询中删除 sql 注入(inject)并使其正常运行?

c# - 在 C# 中使用 block 处理顺序

f# - 非惯用的全局运算符重载如何工作?

f# - WebSharper浏览器的最低要求

c# - 如何访问失败的 Hangfire 作业

generics - 支持 null 的结构和引用类型的类型约束

F# 中的 C# 对象初始化语法