在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
会被忽略吗?还是会在其他地方引起问题?
我在一个测试应用程序中尝试过,它似乎运行良好,但这并不意味着它是正确的:)
在引擎盖下面,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
,因此什么也没发生。看来还可以。