The key difference is that when you start a workflow with Async.StartChild
, it will share the cancellation token with the parent. If you cancel the parent, all children will be cancelled too. If you start the child using Async.Start
, then it is a completely independent workflow.
Here is a minimal example that demonstrates the difference:
// 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()
In this example, if you start the computation using (1)
, then all work items will finish and print after 2 seconds. If you use (2)
they will all be cancelled when the main workflow is cancelled.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…