Reactive Extensions混合多个序列

时间:2014-06-03 09:28:06

标签: system.reactive

我正在TCP环境中工作,我需要对传入的数据做出反应:如果收到的数据太多,我需要忽略除最后收到的数据之外的所有数据;如果长时间没有数据进入,我必须向服务器发送请求。

第一个命题就是这样解决的:

 Observable.FromEventPattern<ObjectReceivedEventArgs>( _client, "ObjectReceived" )
           .Throttle( TimeSpan.FromMilliseconds( 500 ) )
           .Subscribe( args => ... );

第二个命题通过计时器解决:

Observable.Timer( ... ).Subscribe( ... );

现在,我可以将这两件事情混合在一起,这样如果没有数据及时,我可以向服务器发送请求吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以再次订阅源事件,如下所示:

Observable.FromEventPattern<ObjectReceivedEventArgs>(_client, "ObjectReceived")
          .Select(_ => Unit.Default)
          .StartWith(Unit.Default)
          .Throttle(TimeSpan.FromSeconds(/*desired timeout here */))
          .Take(1).Repeat()
          .Subscribe(_ => /* poke server here */);

这样做是用Unit值开始关闭流并尝试在事件到达时限制它。只要事件在超时时间内到达,流就会被节流抑制,只要事件暂停一段时间就会触发OnNext。请注意,即使没有其他事件到达,Take(1)也会导致超时在每次后续暂停后继续触发 - 如果您只想在事件停止后只调用一次服务器,则删除它。