最终异步{try ... finally ...}没有被调用的可能原因是什么? Rx参与

时间:2015-05-23 22:14:49

标签: asynchronous f# system.reactive cancellation

我有这样的事情:

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因为取消或vma而发生结束1}}。)

然后{{1}}拒绝取消或最后被忽略我不知道哪个。

2 个答案:

答案 0 :(得分:3)

.Net中的取消是合作的。这意味着一旦任务开始,发信号CancellationToken没有实际效果,除非你监视它。

要启用取消,您需要在实际操作中检查CancellationToken.IsCancellationRequested,如果为true,则结束它。或者您可以调用CancellationToken.ThrowIfCancellationRequested抛出结束操作的异常。

答案 1 :(得分:3)

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

使用this ToTask overload