F# 异步。并行不';t运行列表|>;异步并行|>;异步。忽略|>;异步启动?
我有以下代码要测试 但是,它会在最后打印F# 异步。并行不';t运行列表|>;异步并行|>;异步。忽略|>;异步启动?,f#,F#,我有以下代码要测试 但是,它会在最后打印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 |> Asy
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
let ag=new BlockingQueueAgent(500)
让enqueue()=async{for i=0到1000 do ag.Add(Some i)}
[enqueue();enqueue();enqueue()]|>异步.Parallel |>异步.Ignore |>异步.Start
ag.无添加
设可变x=0
让rec退出队列()=
异步的{
设!m=ag.AsyncGet()
匹配
|一些v->
x
打印fn“完成%d”x
}
dequeue()|>Async.RunSynchronously
您似乎有一个竞争条件:ag.Add None
发生在排队
拷贝甚至有机会运行之前,因为您正在使用Async.Start
在后台线程上启动它们。为了保持正确的操作顺序,请将它们全部作为单个异步工作流的一部分:
let enqueueAll = async {
do! [ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore
ag.Add None
}
Async.Start enqueueAll
这样,ag.Add None
将在Async.Parallel
完成之前不会执行,这将在enqueue()
的所有副本完成后执行