我正在尝试在一段时间内没有事件时实现超时。
场景:
我有一个对象,每次收到消息时都会引发一个事件。 我想在一段时间内(比如说 20 秒)没有收到消息(OnReceived 事件)时使用react
这是我到目前为止所拥有的
var observable = Observable.FromEventPattern<BasicDeliverEventHandler>(
handler => _innerConsumer.Received += OnReceived,
handler => _innerConsumer.Received -= OnReceived);
var timeout = observable.Timeout(TimeSpan.FromSeconds(20));
using (timeout.Subscribe(_ => { },
exception =>
Tracer.Warning("Eventing Consumer timeout : {0}", exception.Message)))
{ }
我正在从 EventPattern 创建一个可观察对象。然后,使用超时。我不明白的是如何从超时中获取异常。当这种情况发生时我想使用react。
我认为订阅方法不是正确的方法,但这是我从文档中得到的。 如果这不正确,我愿意接受建议或其他替代方案。
提前致谢
最佳答案
Timeout
是有问题的,因为它终止了序列。 Throttle
是您想要的 - 但您还需要插入一个开始元素,以防您根本没有收到任何事件。
我将事件转换为 Unit.Default - 当您不关心发生了什么,只关心发生了某事时,这非常有用 - 并使用 StartWith
来播种节流:
var timeout = observable.Select(_ => Unit.Default)
.StartWith(Unit.Default)
.Throttle(TimeSpan.FromSeconds(20);
var subs = timeout.Subscribe(_ => Console.WriteLine("Timeout!"));
出于兴趣,我也有一个类似的解决方案来检测断开连接的客户端 - 这次为多个源提供单个超时通知:http://www.zerobugbuild.com/?p=230
关于c# - 将 Rx 超时与 FromEventPattern Observer 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075543/