考慮以下定義 獲取取消標記
let test =
Async.FromContinuations(
fun (cont,econt,ccont) ->
let rec inner() =
async {
do printfn "looping..."
do! Async.Sleep 1000
return! inner()
}
Async.Start(inner())
cont())
假設我想嘗試像這樣
let cts = new CancellationTokenSource()
Async.Start(test, cts.Token)
cts.Cancel()
計算這自然不會讓內部循環停止,因爲我沒有通過合適的取消標記。有什麼辦法可以通過Async.FromContinuations獲取外部取消標記嗎?我可以使用異步構建器和Async.CancellationToken來重寫,但是我會失去將延續傳遞給內部表達式的能力。
不要忘記處理CTS,可能是通過將它放在異步中的使用條款下。 – t0yv0
@toyvo同意 - 缺少'Dispose'是不好的。但是CTS不應該由調用者處理(誰創建它)?可能在'cts.Cancel()'調用之後? (我認爲在異步中調用Dispose可能是錯誤的。) –
@TomasPetricek是的,你是對的。當我想在異步完成時想要釋放CTS的情況下,但您還需要確保在Dispose之後不會調用Cancel;它需要更多的代碼。 – t0yv0