在Observable.FromAsync内部引发OperationCanceledException是否正确

本文关键字:OperationCanceledException 是否 Observable FromAsync 内部 | 更新日期: 2023-09-27 18:24:58

我有一些类似的代码

observable.Select(x => Observable.FromAsync(token => Task.Run(() =>
{
    // ... do some work ...
    token.ThrowIfCancellationRequested();
    // ... do some more work ...
    return 7 * x;
}, token)))
.Switch()
.Subscribe(x => 
{
    // Whatever
});

发生在Task内部的工作可能需要一段时间,所以如果Switch已经转移到另一个任务(因为observable中有一个新值),我想中止执行该工作。

呼叫ThrowIfCancellationRequested()是正确的做法吗?即,一旦从FromAsync返回的IObservable被处理(并取消了令牌),我的OperationCanceledException会被忽略吗?还是会在其他地方引起问题?

我在一个测试应用程序中尝试过,它似乎运行良好,但这并不意味着它是正确的:)

在Observable.FromAsync内部引发OperationCanceledException是否正确

在引擎盖下面,task.ToObservable()最终被调用。ToObservable为最终完成此任务的任务添加了一个延续:

switch (task.Status)
{
case TaskStatus.RanToCompletion:
    subject.OnNext(Unit.Default);
    subject.OnCompleted();
    return;
case TaskStatus.Canceled:
    subject.OnError(new TaskCanceledException(task));
    return;
case TaskStatus.Faulted:
    subject.OnError(task.Exception.InnerException);
    return;
default:
    return;
}

这意味着TaskCanceledException将导致可观测的失败。但在发生这种情况时,在您的代码中没有观察者观察AsyncSubject,因此什么也没发生。看来还可以。

相关文章:
  • 没有找到相关文章