是否可以在线程池中启动异步工作流,并且稍后,等待其完成,类似于启动Task
并稍后调用{{1} }?我知道可以启动异步工作流并同时等待它。关键是决定稍后等待完成。
答案 0 :(得分:3)
您可以使用Async.StartChild
- 您可以在异步工作流中运行它,并计划在后台启动另一个异步操作(默认情况下,这会将其添加到线程池中)。该操作为您提供了另一个Async<'R>
后退,您可以使用它来等待后台操作的完成。
let backgroundOp = async {
printfn "Background operation starting"
do! Async.Sleep 1000
printfn "Background operation done"
return 1 + 1
}
let mainOp = async {
printfn "Main operation starting"
let! awaiter = backgroundOp |> Async.StartChild
printfn "Doing more stuff in main"
let! res = awaiter
printfn "Main completed with child result: %d" res
}
编辑:我从评论中看到您的调用代码不在异步工作流程中。如果你可以改变它以便它在异步内运行,这可能是一个更好的设计,但似乎你仍然可以使用Async.StartChild
并写下这样的东西:
// Start the backgroundOp and (synchronously) return awaiter that
// we can use to wait for the result of the background operation
let awaiter =
async { let! awaiter = backgroundOp |> Async.StartChild
return awaiter } |> Async.RunSynchronously
// Now you can use the awaiter to wait for the completion synchronously
awaiter |> Async.RunSynchronously