我有以下代码来测试https://github.com/fsprojects/FSharpx.Async/blob/master/src/FSharpx.Async/BlockingQueueAgent.fs
但是,它会在末尾打印Done 0。看起来[ enqueue(); enqueue(); enqueue() ]没有运行?
let ag = new BlockingQueueAgent<int option>(500)
let enqueue() = async { for i = 0 to 1000 do ag.Add (Some i) }
[ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore |> Async.Start
ag.Add None
let mutable x = 0
let rec dequeue() =
async {
let! m = ag.AsyncGet()
match m with
| Some v ->
x <- x + v
return! dequeue()
| None ->
printfn "Done %d" x
}
dequeue() |> Async.RunSynchronously 发布于 2019-08-10 05:52:33
看起来你有一个竞争条件:ag.Add None发生在enqueue拷贝甚至有机会运行之前,因为你使用Async.Start在后台线程上启动它们。为了保持正确的操作顺序,请使它们都成为单个异步工作流的一部分:
let enqueueAll = async {
do! [ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore
ag.Add None
}
Async.Start enqueueAll这样,在Async.Parallel完成之前不会执行ag.Add None,这将在enqueue()的所有副本完成之后发生。
https://stackoverflow.com/questions/57437300
复制相似问题