什么可能的原因是async {try..最后. .}没有被调用?Rx



我有这样的东西:

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

a中等待的任务完成时,执行finally块并完成清理,但是当异步acancellationTokenSourceCancel调用而取消时,未完成清理。事实上,我怀疑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抛出异常,结束操作。

相关内容

  • 没有找到相关文章

最新更新