我正在从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值"(根据您的意愿定义-Maybe
、Nullable<T>
等),从而使结果流的"形状"对任何订阅者来说都更加清晰。