【发布时间】:2023-09-04 22:48:01
【问题描述】:
我有这样的事情:
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拒绝取消或者最后只是跳过了我不知道是哪个。
【问题讨论】:
-
你能发布一个完整的样本吗?请注意,该任务需要测试它是否已取消。如果没有,它不会取消
标签: asynchronous f# system.reactive cancellation