繁体   English   中英

Observable.Retry()无法与Hot Observables一起正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM