我有这样的东西:
let a =
async {
try
do! Async.AwaitTask someTask
finally
// clean up
}
Async.Start (a, cancellationTokenSource.Token)
当 a
中等待的任务完成时,finally
block 执行并完成清理,但是当异步 a
被取消时因为 cancellationTokenSource
调用了 Cancel
,所以没有进行清理。事实上,我怀疑 a
一直在运行。
我真的没有头绪,所以这里有一个初步的猜测:不,我真的猜不到。
编辑
看来问题出在a
正在等待的任务上。
如果 someTask
是这样的:
Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))
那么,没问题:) 但!如果任务是这样的:
vm.Finished.Select(ignore).FirstAsync().ToTask()
(vm
是一个 View 模型。Finished
一个事件。基本上,我希望 a
由于取消或因为 Finished
发生在 vm
中。)
然后 a
拒绝被取消或最终被跳过我不知道是哪个。
最佳答案
需要将CancellationToken
传递给ToTask()
,否则无法取消。
关于asynchronous - 没有调用 async { try...finally...} 的 finally 的可能原因是什么? Rx 涉及,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418097/