所有这些Reactive Observable扩展之间的实际区别是什么?

时间:2010-03-05 19:25:00

标签: .net system.reactive

给定一个BehaviorSubject,调用所有这些不同函数之间的实际区别是什么?

  • 首先()
  • 最后()
  • LatestValue()
  • MostRecentValue()
  • NextValue()
  • 单()
  • 服(1)

假设我理解正确,在给定BehaviorSubject的情况下,他们应该做同样的事情。

如果是这样,那么哪个电话是最合适的(我的意思是:哪个最符合我的意图)?或许是第一个还是单身?

如果没有,那么实际的差异是什么?

2 个答案:

答案 0 :(得分:6)

First,Last和Single阻塞;建议改用Take(1),这样就可以得到一个IObservable。链接查询运算符时,建议避免使用First,Last和Single,因为退出monad的安全性...也就是说你有阻塞副作用。有关详情,请参阅http://blogs.msdn.com/jeffva/archive/2009/12/09/first-last-contains-etc-can-be-extremely-dangerous-yet-extremely-useful.aspx

MostRecentValue和LatestValue已从最新版本的Rx中删除,因为它们也是阻塞的,所以唯一的阻塞运算符是First,Last和Single(以及xxxOrDefault变体),根据最新发布的说明。 / p>

MostRecent将返回最后一个采样值,就像你调用它一样(并且它需要一个initialValue来保证它永远不会等待),即“不消耗”,而最新将等到一个值到达然后返回它“消费“ - 也就是说,如果再次呼叫Latest,它将不会返回与上次呼叫相同的值,它会等到下一个值到达,如果有的话。

答案 1 :(得分:0)

谢谢@RichardHein的回答。

阻塞扩展方法应该真正移动到它们自己的命名空间中,因此开发人员必须专门选择将它们包含在项目中(或者特别是CS文件)。你使用Rx增加了大量的复杂性,并且不小心使用阻塞方法,你基本上将其转换回IList / IEnumerable。

我认为这是Rx团队犯下的最大错误,我认为默认情况下他们错过了Rx的“成功之道”。解决这个问题,在C#中超越单线程+异步时,我会将Rx称为首选API(即为什么.NET比NodeJS更强大)。