Rx.Net 当源序列闲置一段时间后,如何发射一个元素?
Rx.Net How can I emit an element when a source sequence has been idle for a time?
我想创建一个序列,只要源序列发出一个值,它就会发出一个值(比方说 'true')。然后,当源序列空闲一段时间后,发出 'false'。本质上,我需要知道源序列何时为 'idle' 一段时间。
Source: ---1-----5-------2-------(timeout)--------8-----3------>
| | | | | |
Output: ---true--true----true----false------------true--true--->
其实我不需要重复出现true,这样就更好了:
Source: ---1-----5-------2-------(timeout)---------8-----3------>
| | |
Output: ---true------------------false-------------true--------->
我看过 ,但老实说我不太明白它是如何工作的。似乎应该有一个更简单的答案。
更糟糕的是,我确信我以前已经解决过这个确切的问题,但我不记得是如何解决的!有人可以帮忙吗?
使用 Switch
非常简单。试试这个:
var source = new Subject<int>();
var query =
source
.Select(x =>
Observable
.Timer(TimeSpan.FromSeconds(1.0))
.Select(y => false)
.StartWith(true))
.Switch();
query.Subscribe(Console.WriteLine);
source.OnNext(1);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(5);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(2);
Thread.Sleep(TimeSpan.FromSeconds(1.5));
source.OnNext(8);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(3);
这给了我:
True
True
True
False
True
True
False
我想创建一个序列,只要源序列发出一个值,它就会发出一个值(比方说 'true')。然后,当源序列空闲一段时间后,发出 'false'。本质上,我需要知道源序列何时为 'idle' 一段时间。
Source: ---1-----5-------2-------(timeout)--------8-----3------> | | | | | | Output: ---true--true----true----false------------true--true--->
其实我不需要重复出现true,这样就更好了:
Source: ---1-----5-------2-------(timeout)---------8-----3------> | | | Output: ---true------------------false-------------true--------->
我看过
更糟糕的是,我确信我以前已经解决过这个确切的问题,但我不记得是如何解决的!有人可以帮忙吗?
使用 Switch
非常简单。试试这个:
var source = new Subject<int>();
var query =
source
.Select(x =>
Observable
.Timer(TimeSpan.FromSeconds(1.0))
.Select(y => false)
.StartWith(true))
.Switch();
query.Subscribe(Console.WriteLine);
source.OnNext(1);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(5);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(2);
Thread.Sleep(TimeSpan.FromSeconds(1.5));
source.OnNext(8);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
source.OnNext(3);
这给了我:
True True True False True True False