有没有办法将观察者订阅为异步

时间:2013-09-15 16:38:22

标签: c# multithreading asynchronous system.reactive reactive-programming

鉴于同步观察者,有没有办法做到这一点:

observable.SubscribeAsync(observer);

并且observer上的所有方法都是异步调用的,或者是在创建观察者时我必须处理的事情?

3 个答案:

答案 0 :(得分:11)

如果您需要在流输出新值时调用异步方法,您会发现最常用的解决方案是使用SelectMany。问题是,这不会等待方法完成,导致SelectMany创建的任何任务并行运行。

如果您想在等待异步功能完成时阻止流,则需要以下内容:

Observable.Interval(TimeSpan.FromSeconds(1))
          .Select(l => Observable.FromAsync(asyncMethod))
          .Concat()
          .Subscribe();

或者:

Observable.Interval(TimeSpan.FromSeconds(1))
          .Select(_ => Observable.Defer(() => asyncMethod().ToObservable()))
          .Concat()
          .Subscribe();

答案 1 :(得分:8)

您可能希望查看ObserveOnSubscribeOnmore informationeven more information)。

答案 2 :(得分:3)

如果通过异步调用观察者的方法,你的意思是你想要一个可以发布新通知而不等待处理完之前的通知的情况,那么这就是你必须自己做的事情。这违反了Rx的合同,因为如果您可以同时在飞行中有多个通知,则无法再保证按顺序处理通知。我认为这种方法还有其他问题 - 这是你要小心的事情。

另一方面,如果您只想处理与创建通知的线程不同的线程上的通知,那么ObserveOn和SubscribeOn就是您想要查看的内容。