我想运行一些异步工作流,然后等待它完成,然后打印一些结果,例如:
let dowork n =
async {
do printfn "work %d" n
}
let creatework() =
async {
for x in [1..5] do
Async.Start(dowork x)
}
Async.RunSynchronously(creatework())
printfn "finished"当我运行这段代码时,我希望所有的dowork调用都在打印“完成”之前完成。然而,我得到的结果如下:
工时2工时3工时4工时5已完成工时1
我曾尝试从creatework()中删除async,但在运行async工作流之前输出了"finished“。
在实际的dowork中,程序执行一些IO,所以我希望等待最慢的IO完成,然后再继续。
发布于 2010-11-05 23:39:50
好吧,回答我自己的问题似乎很差劲,但这似乎是有效的。有人想出更好的办法,这样我就可以给他们答案了:)
let dowork n =
async {
do printfn "work %d" n
}
let creatework() =
[1..5] |> Seq.map dowork |> Async.Parallel |> Async.RunSynchronously
creatework()
printfn "finished"它给出了各种输出,但到目前为止“完成”总是最后一次...
发布于 2010-11-30 05:12:13
我发现使用MailboxProcessor来确保所有的副作用(比如printfn)都发生在同一个线程上是很方便的。使用MailboxProcessor.PostAndReply(singleResult)将工作结果(可能只是要打印的字符串)收集到相同的同步上下文中,并提供另一种返回聚合值的消息类型。可以对这些消息的类型使用联合。
https://stackoverflow.com/questions/4106846
复制相似问题