[英]Observable.Retry() is not working as expected with 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因间歇性故障而臭名昭著。 重试扩展方法提供了在指定次数或成功后重试失败的能力。
我在样本中注意到的行为与Campbell指出的行为不匹配,也与他的样本都不匹配。 我想念什么?
如果我不使用Publish().RefCount()
它将正常工作。
当出现可观察到的错误时,它就死定了。 没有更多的通知应该流出。 在您的情况下, o
会.Publish().Refcount()
,并且由于.Publish().Refcount()
, Retry
尝试重新订阅相同的可观察对象(已失效且已完成)。 那就是Publish
所做的:与其创建新的可观察对象,不如将多个客户端订阅到同一可观察对象。
如果删除.Publish().Refcount()
,则会看到它尝试重新订阅新的可观察对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.