我正在尝试移植这个简单的循环:
var messages = new List<string>();
while (_MessageQueue.TryDequeue(out var message))
messages.Add(message);
其中消息队列是并发的。它用在一个模块中,该模块将来自多个线程的消息排入队列,然后由单个线程处理。
是否有惯用的 F# 方法来执行出列/添加循环?
最佳答案
F# 有几种实现并发的方法,包括对 agent-based programming 的良好支持。 ,因此您正在做的事情的惯用 F# 版本很可能不会实际使用 conrrent 队列,而是基于代理或其他一些体系结构。
但是,要回答有关循环的具体问题 - 由于巧妙地使用了 while
和 out 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/