没有调用 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(),否则无法取消。

使用this ToTask overload.