我希望IObservable.Subscribe
是异步的:无论内部发生什么,我都希望我的订阅回来。
但Retry
似乎有不同的语义:
var retry = Observable.Throw(new Exception(), 0).Retry();
Console.WriteLine("got here");
var subscription = retry.Subscribe();
Console.WriteLine("didn't get here, ever");
这里有一些我不明白的东西。我想在没有参数的情况下使用Retry不能经常使用,或者它应该被用于我没想过的东西。
答案 0 :(得分:1)
问题与Retry
无关 - 它是Observable.Throw
,因为它默认在立即调度程序上安排其OnError
。将你的第一行改为此,你就是金色的:
var retry = Observable.Throw<int>(new Exception(), Scheduler.Default).Retry();
通常,Rx尝试使用最直接的调度程序。 Scheduler.Default
将使用当前平台的首选调度程序来引入并发。
Retry
最初将订阅当前线程(这很好),然后在Throw
终止的任何线程上订阅每次重试。
修改
虽然上面的修复工作 - 但它可能不是最好的方法。 Throw
和Retry
尝试使用立即调度程序实际上很好,因为这是计算效率最高的方法。上面的代码将导致 Throw
的每个迭代在不同的线程上运行。
更好,更惯用的Rx解决方案是编辑第三行:
var subscription = retry.SubscribeOn(Scheduler.Default).Subscribe();
这导致只有Retry
的初始订阅在另一个线程上异步发生 - 其余的处理将保留在该一个线程上。