asynchronous - 没有调用 async { try...finally...} 的 finally 的可能原因是什么? Rx 涉及

标签 asynchronous f# system.reactive cancellation

我有这样的东西:

let a =
    async {
        try
            do! Async.AwaitTask someTask
        finally
            // clean up
    }
Async.Start (a, cancellationTokenSource.Token)

a 中等待的任务完成时,finally block 执行并完成清理,但是当异步 a 被取消时因为 cancellationTokenSource 调用了 Cancel,所以没有进行清理。事实上,我怀疑 a 一直在运行。

我真的没有头绪,所以这里有一个初步的猜测:不,我真的猜不到。

编辑

看来问题出在a正在等待的任务上。 如果 someTask 是这样的:

Async.Ignore (Async.AwaitIAsyncResult <| Task.Delay(5000))

那么,没问题:) 但!如果任务是这样的:

vm.Finished.Select(ignore).FirstAsync().ToTask()

(vm 是一个 View 模型。Finished 一个事件。基本上,我希望 a 由于取消或因为 Finished 发生在 vm 中。)

然后 a 拒绝被取消或最终被跳过我不知道是哪个。

最佳答案

需要将CancellationToken传递给ToTask(),否则无法取消。

使用this ToTask overload .

关于asynchronous - 没有调用 async { try...finally...} 的 finally 的可能原因是什么? Rx 涉及,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418097/

相关文章:

c# - 如何处理使 UI 无响应的同步(阻塞)调用

c# - 可观察到的 : Getting latest value in intervals until source finishes

Node.js For 循环异步请求

python - 所有任务完成后如何终止 python asyncio event_loop

javascript - 将数据传递回异步请求的调用函数

javascript - Meteor.js 异步帮助 : Setting Up Test Data on the Server

f# - 为什么模块与类中相同 F# 函数的类型签名之间存在差异?

f# - 可选参数类型不匹配

f# - 是否可以在 F# 中组合多个属性?

c# - IObservable .Cast<>() 和协方差