没有调用 async { try...finally...} 的 finally 的可能原因是什么? Rx 涉及
What are the possible reasons the finally of an async { try... finally...} is not being called? Rx Involved
我有这样的东西:
let a =
async {
try
do! Async.AwaitTask someTask
finally
// clean up
}
Async.Start (a, cancellationTokenSource.Token)
当 a
中等待的任务完成时,finally
块执行并完成清理,但是当异步 a
被取消时,因为 cancellationTokenSource
得到Cancel
已调用,未进行清理。事实上,我怀疑 a
保持 运行.
我真的一点头绪都没有,所以先来个初步猜测:不,我真的猜不到。
编辑
看来问题出在a
正在等待的任务上。
如果someTask
是这样的:
Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))
那么,没问题:)
但!如果任务是这样的:
vm.Finished.Select(ignore).FirstAsync().ToTask()
(vm
是一个视图模型。Finished
一个事件。基本上,我希望 a
结束要么是因为取消,要么是因为 Finished
发生在vm
.)
然后a
拒绝取消或者最终被跳过我不知道是哪个。
.Net 中的取消是合作的。这意味着一旦任务开始,发出 CancellationToken
信号就没有实际效果,除非您监视它。
要启用取消,您需要在实际操作中检查 CancellationToken.IsCancellationRequested
,如果为真,则结束它。或者您可以调用 CancellationToken.ThrowIfCancellationRequested
以抛出结束操作的异常。
您需要将CancellationToken
传递给ToTask()
,否则无法取消。
我有这样的东西:
let a =
async {
try
do! Async.AwaitTask someTask
finally
// clean up
}
Async.Start (a, cancellationTokenSource.Token)
当 a
中等待的任务完成时,finally
块执行并完成清理,但是当异步 a
被取消时,因为 cancellationTokenSource
得到Cancel
已调用,未进行清理。事实上,我怀疑 a
保持 运行.
我真的一点头绪都没有,所以先来个初步猜测:不,我真的猜不到。
编辑
看来问题出在a
正在等待的任务上。
如果someTask
是这样的:
Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))
那么,没问题:) 但!如果任务是这样的:
vm.Finished.Select(ignore).FirstAsync().ToTask()
(vm
是一个视图模型。Finished
一个事件。基本上,我希望 a
结束要么是因为取消,要么是因为 Finished
发生在vm
.)
然后a
拒绝取消或者最终被跳过我不知道是哪个。
.Net 中的取消是合作的。这意味着一旦任务开始,发出 CancellationToken
信号就没有实际效果,除非您监视它。
要启用取消,您需要在实际操作中检查 CancellationToken.IsCancellationRequested
,如果为真,则结束它。或者您可以调用 CancellationToken.ThrowIfCancellationRequested
以抛出结束操作的异常。
您需要将CancellationToken
传递给ToTask()
,否则无法取消。