我有一些类似于
的代码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()
的调用是否正确?即,一旦从IObservable
返回的FromAsync
被处置(并取消了令牌),我的OperationCanceledException
是否会被忽略 - 或者会在其他地方引起问题?
我在测试应用程序中尝试了这个,它似乎工作正常 - 但这并不意味着它是正确的:)
答案 0 :(得分:1)
在引擎盖下,最终会调用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
所以没有任何反应。所以看起来还可以。