首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async.Parallel不运行list |> Async.Parallel |> Async.Ignore |> Async.Start?

Async.Parallel不运行list |> Async.Parallel |> Async.Ignore |> Async.Start?
EN

Stack Overflow用户
提问于 2019-08-10 05:27:57
回答 1查看 46关注 0票数 0

我有以下代码来测试https://github.com/fsprojects/FSharpx.Async/blob/master/src/FSharpx.Async/BlockingQueueAgent.fs

但是,它会在末尾打印Done 0。看起来[ enqueue(); enqueue(); enqueue() ]没有运行?

代码语言:javascript
复制
let ag = new BlockingQueueAgent<int option>(500)

let enqueue() = async { for i = 0 to 1000 do ag.Add (Some i) }

[ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore |> Async.Start

ag.Add None

let mutable x = 0

let rec dequeue() =
    async {
        let! m = ag.AsyncGet()
        match m with
        | Some v ->
            x <- x + v
            return! dequeue()
        | None -> 
            printfn "Done %d" x
    }

dequeue() |> Async.RunSynchronously 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-10 05:52:33

看起来你有一个竞争条件:ag.Add None发生在enqueue拷贝甚至有机会运行之前,因为你使用Async.Start在后台线程上启动它们。为了保持正确的操作顺序,请使它们都成为单个异步工作流的一部分:

代码语言:javascript
复制
let enqueueAll = async {
    do! [ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore
    ag.Add None
}

Async.Start enqueueAll

这样,在Async.Parallel完成之前不会执行ag.Add None,这将在enqueue()的所有副本完成之后发生。

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

https://stackoverflow.com/questions/57437300

复制
相关文章

相似问题

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