15

asyncSendMsg何も返さず、別の非同期ブロック内で開始したいが、終了するのを待たないと仮定すると、これに違いはありますか?

async {
    //(...async stuff...)
    for msg in msgs do 
        asyncSendMsg msg |> Async.Start
    //(...more async stuff...)
}

async {
    //(...async stuff...)
    for msg in msgs do 
        let! child = asyncSendMsg msg |> Async.StartChild
        ()
    //(...more async stuff...)
}
4

1 に答える 1

24

主な違いは、でワークフローを開始するとAsync.StartChild、キャンセルトークンが親と共有されることです。親をキャンセルすると、すべての子もキャンセルされます。を使用して子を開始する場合Async.Start、それは完全に独立したワークフローです。

違いを示す最小限の例を次に示します。

// Wait 2 seconds and then print 'finished'
let work i = async {
  do! Async.Sleep(2000)
  printfn "work finished %d" i }

let main = async { 
    for i in 0 .. 5 do
      // (1) Start an independent async workflow:
      work i |> Async.Start
      // (2) Start the workflow as a child computation:
      do! work i |> Async.StartChild |> Async.Ignore 
  }

// Start the computation, wait 1 second and than cancel it
let cts = new System.Threading.CancellationTokenSource()
Async.Start(main, cts.Token)
System.Threading.Thread.Sleep(1000)    
cts.Cancel()

この例では、を使用して計算を開始する(1)と、すべての作業項目が2秒後に終了して印刷されます。使用する(2)場合、メインワークフローがキャンセルされると、それらはすべてキャンセルされます。

于 2013-03-08T00:02:32.197 に答える