等待在线程池中启动异步worklow

时间:2015-09-03 12:13:54

标签: asynchronous f#

是否可以在线程池中启动异步工作流,并且稍后,等待其完成,类似于启动Task并稍后调用{{1} }?我知道可以启动异步工作流并同时等待它。关键是决定稍后等待完成。

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