gpt4 book ai didi

c# - 测试取消一个简单的可观察对象不会调用 onError

转载 作者:太空狗 更新时间:2023-10-30 00:13:49 25 4
gpt4 key购买 nike

鉴于以下情况:

为什么从未调用 Subscribe 中的 OnError 处理程序?

var observable = Observable.Create<string>(
async (o, c) =>
{
try
{
var strings = new[] { "A", "B", "C" };

foreach (var s in strings)
{
await Task.Delay(100);
if (c.IsCancellationRequested)
{
// exception thrown here.
Console.WriteLine("cancelled");
throw new OperationCancelledException();
}
o.OnNext(s);
}
o.OnCompleted();
}
catch (Exception ex)
{
// caught here...
o.OnError(ex);
}
});

var tcs = new TaskCompletionSource<bool>();
var token = new CancellationTokenSource();
observable.Subscribe(
str =>
{
Console.WriteLine(str);
token.Cancel(); // cancel after the first iteration.
},
(e) =>
{
// why is this never called.
Console.WriteLine($"on error :: {e.Message}");
tcs.SetResult(true);
},
() =>
{
Console.WriteLine("on complete");
tcs.SetResult(true);
},
token.Token);

// code hangs here because the subscription never completes?
await tcs.Task;
Console.WriteLine("done");

最佳答案

当您在 token 上调用 Cancel 时,您(订阅者,传递 token 并因此“拥有”取消)基本上是在说“我不再对事件感兴趣,包括 OnError() ".

在幕后,Rx 在 observable 和观察者之间插入了一个 AutoDetachObserver,它明确地吞噬了所有进一步的事件。

此行为是设计使然。

OnError() 会在您订阅时告诉您有关失败的信息。取消 token (取消订阅观察者)后,您不再订阅并且不再接收任何事件。换句话说,取消订阅不是错误。取消可观察对象中的 token 不是错误,也不是有效的通信方式 - 调用 OnError() 是。

关于c# - 测试取消一个简单的可观察对象不会调用 onError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com