首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何等待异步完成

如何等待异步完成
EN

Stack Overflow用户
提问于 2010-11-05 22:32:56
回答 2查看 2.8K关注 0票数 5

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

代码语言:javascript
运行
复制
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完成,然后再继续。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-05 23:39:50

好吧,回答我自己的问题似乎很差劲,但这似乎是有效的。有人想出更好的办法,这样我就可以给他们答案了:)

代码语言:javascript
运行
复制
let dowork n =
    async {
        do printfn "work %d" n
    }

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

creatework()    
printfn "finished"

它给出了各种输出,但到目前为止“完成”总是最后一次...

票数 9
EN

Stack Overflow用户

发布于 2010-11-30 05:12:13

我发现使用MailboxProcessor来确保所有的副作用(比如printfn)都发生在同一个线程上是很方便的。使用MailboxProcessor.PostAndReply(singleResult)将工作结果(可能只是要打印的字符串)收集到相同的同步上下文中,并提供另一种返回聚合值的消息类型。可以对这些消息的类型使用联合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4106846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档