Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 异步。并行不';t运行列表|>;异步并行|>;异步。忽略|>;异步启动?_F# - Fatal编程技术网

F# 异步。并行不';t运行列表|>;异步并行|>;异步。忽略|>;异步启动?

F# 异步。并行不';t运行列表|>;异步并行|>;异步。忽略|>;异步启动?,f#,F#,我有以下代码要测试 但是,它会在最后打印Done 0。似乎[enqueue();enqueue();enqueue()]未运行 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 |> Asy

我有以下代码要测试

但是,它会在最后打印
Done 0
。似乎
[enqueue();enqueue();enqueue()]
未运行

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 
let ag=new BlockingQueueAgent(500)
让enqueue()=async{for i=0到1000 do ag.Add(Some i)}
[enqueue();enqueue();enqueue()]|>异步.Parallel |>异步.Ignore |>异步.Start
ag.无添加
设可变x=0
让rec退出队列()=
异步的{
设!m=ag.AsyncGet()
匹配
|一些v->
x
打印fn“完成%d”x
}
dequeue()|>Async.RunSynchronously

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

let enqueueAll = async {
    do! [ enqueue(); enqueue(); enqueue() ] |> Async.Parallel |> Async.Ignore
    ag.Add None
}

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