IObservable.Generate用于可变间隔

时间:2018-06-02 01:16:32

标签: c# system.reactive

我对使用System.Reactive非常陌生,并想知道我的解决方案是否可以改进。我需要按照前一个事件确定的间隔订阅一系列无限的事件。我在这里看到了使用IObservable.Generate的其他解决方案,并提出了以下哪些方法有效,但这是不错的做法?

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

NextCheck()返回TimeSpanCheckForUpdate()返回bool并执行事件处理。

1 个答案:

答案 0 :(得分:1)

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

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。由于您根本不使用该值,因此也可以使用明确无用的值来明确这一点。