如何等待异步完成

yan*_*nta 5 f# asynchronous

我想运行一些异步工作流,然后在打印一些结果之前等待它完成,例如:

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"
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我希望所有的dowork调用在打印"完成"之前完成.但是我得到这样的结果:

工作2工作3工作4工作5完成工作1

我尝试从creatework()中删除异步,但在运行异步工作流之前打印"已完成".

在真正的dowork中,程序会执行一些IO,所以我想在继续之前等待最慢的完成.

yan*_*nta 9

好吧回答我自己的问题似乎很蹩脚,但这似乎有效.有人想出更好的东西,所以我可以给他们答案:)

let dowork n =
    async {
        do printfn "work %d" n
    }

let creatework() =
    [1..5] |> Seq.map dowork |> Async.Parallel |> Async.RunSynchronously

creatework()    
printfn "finished"
Run Code Online (Sandbox Code Playgroud)

它提供了各种输出,但到目前为止"完成"总是持续...

  • 这是正确的答案.您在异步块内调用"Async.Start"的原始代码非常非惯用.`Async.Parallel`是进行fork-join并行性的正确方法. (2认同)
  • 微小的重构:而不是'Seq.map(有趣的x - > dowork x)`你可以做`Seq.map dowork`. (2认同)