首页 > 解决方案 > IObservable.Generate 用于可变间隔

问题描述

我对使用 System.Reactive 很陌生,想知道我的解决方案是否可以改进。我需要以前一个事件确定的间隔订阅一组无穷无尽的事件。我在这里看到了其他解决方案,IObservable.Generate并提出了以下可行的方法,但这是一种好的做法吗?

IDisposable updateJob = Observable.Generate(
    true,
    _ => true,
    _ => CheckForUpdate(),
    _ => _, 
    _ => NextCheck()).Subscribe();

whereNextCheck()返回 aTimeSpanCheckForUpdate()返回 abool并进行事件处理。

标签: c#system.reactive

解决方案


一方面,如果它有效……耸耸肩。另一方面...

Observable.Generate应该是一种类似于内置可选时间间隙的 for 循环。因此,如果您想迭代整数 1-10,在每次迭代之间暂停 i*100 毫秒,您可以这样做:

var forLoop = Observable.Generate(
    1,
    i => i <= 10,
    i => i + 1,
    i => i,
    i => TimeSpan.FromMilliseconds(i * 100)
)

这样做的好处是 Rx 为您管理迭代器状态,您可以看到这一切。您也可以通过以下方式实现相同的效果:

var opaqueForLoop = Observable.Generate(
    GetFirstValue(),
    _ => CheckIfDone(),
    _ => GetNextValue(),
    i => SaveCurrentValue(i),
    _ => GetNextTimespan()
)

但是你必须实现这些方法,而且你有一些不必要的意大利面条。

您的代码看起来更像后者而不是前者。这可能是必要的,取决于你的问题,我真的不知道。

您可以清楚地做的一件事是将迭代器类型替换为Unit并将值替换为Unit.Default。由于您根本没有使用该值,因此不妨使用明确无用的值来说明这一点。


推荐阅读