c# - 遇到特定值时暂停流
问题描述
我有一个流,每当遇到某个值时我想暂停/停留。最优雅的方法是什么?
想象一下幻数是 4 - 这将阻止在 x 时间内发出任何其他值。如果它们在暂停期间发生,它还将防止发出“陈旧”值,但在暂停之后,它将切换到最近的值
Source +-1-2-3-4-5-6-7-8-9
Pause +----x
Output +-1-2-3-4----67-8-9
解决方案
您可以使用CombineLatest()
将源与另一个处理暂停状态的可观察对象结合起来。合并后使用一个简单Where()
的过滤当前暂停的条目。请参阅以下源代码:
ISubject<bool> pause = new BehaviorSubject<bool>(false);
IObservable<long> original = Observable.Interval(TimeSpan.FromSeconds(1));
IObservable<long> controlled = original.CombineLatest(pause, (o, p) => {
return new { o, p};
})
.Where(it => !it.p)
.Select(it => it.o);
Stopwatch sw = Stopwatch.StartNew();
controlled.Subscribe(it => {
Console.WriteLine($"{sw.ElapsedMilliseconds} - {it}");
});
Thread.Sleep((int)(3.1 * 1000)); // wait for 3.1 seconds
pause.OnNext(true); // pause it
Thread.Sleep((int)(3.5 * 1000)); // wait for 3.5 seconds
pause.OnNext(false); // resume
Thread.Sleep(5 * 1000); // and finally wait for 5 seconds
这将生成以下输出:
1017 - 0
2009 - 1
3007 - 2
6608 - 5
7007 - 6
8007 - 7
9007 - 8
10007 - 9
11007 - 10
如您所见,值3
和4
最初5
被阻止/忽略,但是当暂停标志恢复5
时,一旦暂停标志被重置(6.6 秒后),最后一个值就会再次“重新发送”。之后发出正常的间隔值。
推荐阅读
- jestjs - 测试因 SyntaxError 失败:意外的令牌导出
- twilio - 从俄罗斯电话号码到俄罗斯免费电话号码的呼入电话
- javascript - 如何用 sed 替换缩小的 javascript 文件中的多个值
- excel - 基于工作簿事件运行 Excel 加载项宏
- javascript - 为什么 jQuery 的 .html("abc") 只是临时插入?
- google-chrome - SVG 图像未在 Firefox 中加载
- python-3.x - 从整数或字符串进行简单的日期时间转换
- css - 为什么我的 SVG 剪辑视频仅适用于一种形状而不适用于另一种形状?
- android - 如何在带有片段和 viewpager 的 Android Studio 中使用 Facebook 登录进行 Firebase 身份验证?
- excel - 超链接 - 给出运行时错误 5“无效的过程调用或参数”