订阅Observable.Retry()在完成之前不会返回?

时间:2013-11-26 09:25:14

标签: system.reactive

我希望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不能经常使用,或者它应该被用于我没想过的东西。

1 个答案:

答案 0 :(得分:1)

问题与Retry无关 - 它是Observable.Throw,因为它默认在立即调度程序上安排其OnError。将你的第一行改为此,你就是金色的:

var retry = Observable.Throw<int>(new Exception(), Scheduler.Default).Retry();

通常,Rx尝试使用最直接的调度程序。 Scheduler.Default将使用当前平台的首选调度程序来引入并发。

Retry最初将订阅当前线程(这很好),然后在Throw终止的任何线程上订阅每次重试。

修改

虽然上面的修复工作 - 但它可能不是最好的方法。 ThrowRetry尝试使用立即调度程序实际上很好,因为这是计算效率最高的方法。上面的代码将导致 Throw的每个迭代在不同的线程上运行。

更好,更惯用的Rx解决方案是编辑第三行:

var subscription = retry.SubscribeOn(Scheduler.Default).Subscribe();

这导致只有Retry的初始订阅在另一个线程上异步发生 - 其余的处理将保留在该一个线程上。