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