>我有以下可观察序列
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()
则会看到它尝试重新订阅新的可观察量。