我有这样的事情:
let a =
async {
try
do! Async.AwaitTask someTask
finally
// clean up
}
Async.Start (a, cancellationTokenSource.Token)
当a
中等待的任务完成时,执行finally
块并完成清理,但是当a
获取cancellationTokenSource
时异步Cancel
被取消时a
1}}调用,清理没有完成。事实上,我怀疑a
一直在运行。
我真的没有线索,所以这里有一个初步的猜测:不,我真的没有猜测。
修改
似乎问题出在someTask
等待的任务中。
如果Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))
是这样的话:
vm.Finished.Select(ignore).FirstAsync().ToTask()
那么,没问题:)
但!如果任务是这样的:
vm
(Finished
是一个视图模型。a
一个事件。基本上,我希望Finished
因为取消或vm
因a
而发生结束1}}。)
然后{{1}}拒绝取消或最后被忽略我不知道哪个。
答案 0 :(得分:3)
.Net中的取消是合作的。这意味着一旦任务开始,发信号CancellationToken
没有实际效果,除非你监视它。
要启用取消,您需要在实际操作中检查CancellationToken.IsCancellationRequested
,如果为true,则结束它。或者您可以调用CancellationToken.ThrowIfCancellationRequested
抛出结束操作的异常。
答案 1 :(得分:3)
您需要将CancellationToken
传递给ToTask()
,否则无法取消。