我有这样的东西:
let a =
async {
try
do! Async.AwaitTask someTask
finally
// clean up
}
Async.Start (a, cancellationTokenSource.Token)
当a
中等待的任务完成时,执行finally
块并完成清理,但是当异步a
因cancellationTokenSource
被Cancel
调用而取消时,未完成清理。事实上,我怀疑a
一直在运行。
我真的不知道,所以这里是一个初步的猜测:Nah, I'm really guessless.
编辑
看来问题出在a
正在等待的任务上。如果someTask
是这样:
Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))
那么,没问题:)但是!如果任务是:
vm.Finished.Select(ignore).FirstAsync().ToTask()
(vm
)是视图模型。Finished
事件。基本上,我希望a
因为取消或Finished
发生在vm
中而结束。
然后a
拒绝被取消或最终只是跳过我不知道是哪个
您需要将CancellationToken
传递给ToTask()
,否则无法取消。
使用ToTask重载
. net中的取消是协作的。这意味着一旦任务启动,除非您监视它,否则向CancellationToken
发送信号没有实际效果。
要启用取消,您需要在实际操作中检查CancellationToken.IsCancellationRequested
,如果为真,则结束它。或者您可以调用CancellationToken.ThrowIfCancellationRequested
抛出异常,结束操作。