在Observable.FromAsync中抛出OperationCanceledException是否正确

时间:2013-07-25 12:14:12

标签: c# system.reactive

我有一些类似于

的代码
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是否会被忽略 - 或者会在其他地方引起问题?

我在测试应用程序中尝试了这个,它似乎工作正常 - 但这并不意味着它是正确的:)

1 个答案:

答案 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所以没有任何反应。所以看起来还可以。