我正在TCP环境中工作,我需要对传入的数据做出反应:如果收到的数据太多,我需要忽略除最后收到的数据之外的所有数据;如果长时间没有数据进入,我必须向服务器发送请求。
第一个命题就是这样解决的:
Observable.FromEventPattern<ObjectReceivedEventArgs>( _client, "ObjectReceived" )
.Throttle( TimeSpan.FromMilliseconds( 500 ) )
.Subscribe( args => ... );
第二个命题通过计时器解决:
Observable.Timer( ... ).Subscribe( ... );
现在,我可以将这两件事情混合在一起,这样如果没有数据及时,我可以向服务器发送请求吗?
答案 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)
也会导致超时在每次后续暂停后继续触发 - 如果您只想在事件停止后只调用一次服务器,则删除它。