c# - IObservable.Generate 用于可变间隔
问题描述
我对使用 System.Reactive 很陌生,想知道我的解决方案是否可以改进。我需要以前一个事件确定的间隔订阅一组无穷无尽的事件。我在这里看到了其他解决方案,IObservable.Generate
并提出了以下可行的方法,但这是一种好的做法吗?
IDisposable updateJob = Observable.Generate(
true,
_ => true,
_ => CheckForUpdate(),
_ => _,
_ => NextCheck()).Subscribe();
whereNextCheck()
返回 aTimeSpan
并CheckForUpdate()
返回 abool
并进行事件处理。
解决方案
一方面,如果它有效……耸耸肩。另一方面...
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
。由于您根本没有使用该值,因此不妨使用明确无用的值来说明这一点。
推荐阅读
- python - 您可以使用 protobuf 将 iframe 标签序列化为二进制数据吗?
- python - 如何使用python在谷歌搜索结果中打开一个网站?
- git - 多个目录中的相同单词文件,多个用户没有管理员权限
- r - 计算连续失败及其开始和结束日期
- android - 如何在不使用 Intent 的情况下将事件添加到 Android 设备上的日历
- spring-webflux - 如何使用 Reactor (Spring WebClient) 模拟 for 循环
- sql - 使用 TSQL 在 SQL Server 中使用单引号和逗号将短语拆分为单词
- python - 无论如何我们只能从图像轴中提取文本吗?
- javascript - 将 Jquery 添加到 AMP 页面
- excel - 如何从 2 个查找值单元格中使用 vlookup