c# - 将 Rx 超时与 FromEventPattern Observer 结合使用

标签 c# events timeout system.reactive

我正在尝试在一段时间内没有事件时实现超时。

场景:

我有一个对象,每次收到消息时都会引发一个事件。 我想在一段时间内(比如说 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/

相关文章:

c# - 每当数据库中插入新行时,我想在 C# 中执行代码

javascript - 在纯 JavaScript 中,什么相当于 "jQuery.on"?

javascript - html: 从 onclick 属性访问鼠标事件

c# - C# 和 SQL Server Management Studio 中 SQL 查询的执行时间非常不同

c# - 外部请求的身份验证 - 如何在 SOAP header 中传递用户凭据?

c# - 将变量传递给另一个类,执行计算然后将其传回

c# - 仅通过转发参数生成调用类私有(private)字段方法的方法?

c# - 使用 C# 拆分字符串

Java:为方法设置超时,检查是否可以再次执行

php 超时 - set_time_limit(0); - 不工作