在Observable.FromAsyncPattern上正常处理超时

时间:2013-02-11 14:30:21

标签: c# exception-handling system.reactive

我正在使用AsyncPattern创建一个可观察对象,我希望每隔一段时间进行一次轮询。到目前为止,我已经到了这里:

var observer = Observable.Defer(ObservableFunc)
    .Concat(Observable.Empty<int>().Delay(TimeSpan.FromSeconds(_pollInterval)))
    .Timeout(TimeSpan.FromSeconds(_Timeout_s))
    .Materialize()
    .Repeat()
    .Publish()
    .RefCount();
  • 在有人订阅(Defer
  • 之前不要进行投票
  • 在上次回复后的某个时间内重新轮询(而不只是keep blindly polling)(Concat/Delay
  • 检测民意调查是否已超时(无答案)(Timeout
  • 如果 超时(Repeat
  • ,请重新开始
  • 请勿重新订阅for new subscribers,在没有订阅者(Publish/RefCount)时停止投票。

我的问题是关于那里的Materialize。这(对我来说)似乎是让TimeoutException“通过”的一种相当优雅的方式,以便订阅者可以了解它。我只是不确定是否应该将其作为Notification继续使用,或者可能将其重新实现为某种Maybe/Nullable T

1 个答案:

答案 0 :(得分:1)

这可能不会“合格”作为答案,但评论时间可能太长...... 叹息

我的直觉说:将超时传播为Maybe / Nullable

推理:

  • 可能没有人订阅这个关心它没有产生价值的原因是什么,他们只关心下一个价值由于某种原因不可用。 (当然,我在这里做了很多假设)

要发白,我会跟Timeout调用一个Catch来注入/返回一个“空值”(无论你定义了什么 - Maybe,{{ 1}}等等,从而使得到的流的“形状”对任何订户都更加清晰。