主な違いは、でワークフローを開始すると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)
場合、メインワークフローがキャンセルされると、それらはすべてキャンセルされます。