Asynchronous 异步。从超时和cancellationToken开始?

Asynchronous 异步。从超时和cancellationToken开始?,asynchronous,f#,timeout,cancellation,cancellation-token,Asynchronous,F#,Timeout,Cancellation,Cancellation Token,我有一个Async,正如在的注释中提到的,启动子计算时不需要传递CancellationToken。它将由父级共享,并将两者都取消,例如,请参见 一种方法是使用带有超时的CancellationTokenSource,并使用其CreateLinkedTokenSource方法将其与其他cancel令牌组合。谢谢,我将尝试此方法,但我认为这一方法的缺点是使用OperationCanceledException而不是TimeOutException会导致流产:-(我认为您不应该尝试取消以async.

我有一个
Async,正如在的注释中提到的,启动子计算时不需要传递CancellationToken。它将由父级共享,并将两者都取消,例如,请参见


一种方法是使用带有超时的CancellationTokenSource,并使用其CreateLinkedTokenSource方法将其与其他cancel令牌组合。谢谢,我将尝试此方法,但我认为这一方法的缺点是使用OperationCanceledException而不是TimeOutException会导致流产:-(我认为您不应该尝试取消以async.StartChild开始的内部异步,而是取消外部异步,这反过来会取消内部异步。或者,如果您只取消内部异步,那么外部异步是否会无限期地等待内部异步的结果?
let work dueTime = async{
    do! Async.Sleep dueTime
    printfn "Done" }
let workWithTimeOut timeForWork timeOut = async{
    let! comp = Async.StartChild(work timeForWork, timeOut)
    return! comp }

workWithTimeOut 200 400 |> Async.Start // prints "Done"
workWithTimeOut 400 200 |> Async.Start // throws System.TimeoutException

let cts = new System.Threading.CancellationTokenSource()   
Async.Start(workWithTimeOut 400 200, cts.Token)
System.Threading.Thread.Sleep 100
cts.Cancel() // throws System.OperationCanceledException