Observable.Retry() 在 Hot Observables 中未按预期工作



>我有以下可观察序列

int num = 0;            
var o = Observable.Create<int>(observer => Task.Run(() =>
{
var rnd = new Random((int)DateTime.Now.Ticks);
Console.WriteLine($"Starting subscription loop # {++num}");
for (int i=0;i<100;i++)
{
Thread.Sleep(200);
if (i == 3)
{
observer.OnError(new ApplicationException("test exception"));
break;
}
observer.OnNext(rnd.Next(0, 50));
}
})).Publish().RefCount();

和以下通知处理程序

o
.Retry()
.Subscribe(Console.WriteLine, ex => Console.WriteLine($"Exception occurred: {ex.Message}"), () => Console.WriteLine("Completed"));

这是我的输出

Starting subscription loop # 1
47
27
12
Starting subscription loop # 2
Starting subscription loop # 3
Starting subscription loop # 4
Starting subscription loop # 5
Starting subscription loop # 6
Starting subscription loop # 7
Starting subscription loop # 8
Starting subscription loop # 9
...

我在Lee Campbell的IntroToRx书中读到了以下内容

如果您预计序列会遇到可预测的问题, 您可能只想重试。一个这样的例子,当你想 重试是在执行 I/O(如 Web 请求或磁盘访问(时。I/O 因间歇性故障而臭名昭著。重试扩展方法 提供在失败时重试指定次数或 直到它成功。

我在样本中注意到的行为与坎贝尔注意到的行为不匹配,也与他的样本不匹配。我错过了什么?

如果我不Publish().RefCount(),它工作正常.

当一个可观察到的错误出现时,它就死了,完成了。不应再有通知流出。在您的情况下,o出错了,并且由于.Publish().Refcount()Retry正在尝试重新订阅相同的可观察量(已死且已完成(。这就是Publish所做的:它不是创建新的可观察量,而是将多个客户端订阅到相同的可观察量。

如果您删除.Publish().Refcount()则会看到它尝试重新订阅新的可观察量。

相关内容

  • 没有找到相关文章

最新更新