在Observable上优雅地处理超时.FromAsyncPattern



我正在从AsyncPattern中进行可观察,我希望每隔一段时间对其进行轮询。到目前为止,我已经到了这里:

var observer = Observable.Defer(ObservableFunc)
    .Concat(Observable.Empty<int>().Delay(TimeSpan.FromSeconds(_pollInterval)))
    .Timeout(TimeSpan.FromSeconds(_Timeout_s))
    .Materialize()
    .Repeat()
    .Publish()
    .RefCount();
  • 在有人订阅之前不要轮询(Defer
  • 在最后一次响应后的给定时间重新轮询(而不仅仅是保持盲目轮询)(Concat/Delay
  • 检测轮询是否超时(无应答)(Timeout
  • 如果确实超时,则重新启动(Repeat
  • 不要重新订阅新的订阅者,当没有更多订阅者时停止轮询(Publish/RefCount

我的问题是关于中间的Materialize。这(对我来说)似乎是一种相当优雅的方式,可以让TimeoutException"通过",这样订阅者就可以知道它。我只是不确定我是应该让它作为Notification继续运行,还是可能将它重新实现为某种Maybe/Nullable T

这可能不是一个"合格"的答案,但对于注释来说可能太长了叹息

我的直觉是:将超时作为Maybe/Nullable

推理:

  • 可能没有人会关心它未能产生价值的原因,他们只关心下一个价值因某种原因无法获得。(当然,我在这里做了很多假设)

为了whit,我会在Timeout调用之后使用Catch,它将注入/返回一个"null值"(根据您的意愿定义-MaybeNullable<T>等),从而使结果流的"形状"对任何订阅者来说都更加清晰。

相关内容

  • 没有找到相关文章