【问题标题】:Rx.Net How can I emit an element when a source sequence has been idle for a time?Rx.Net 如何在源序列空闲一段时间时发出元素?
【发布时间】:2020-07-06 09:36:25
【问题描述】:

我想创建一个在源序列发出值时发出值(假设为“真”)的序列。然后,当源序列空闲一段时间时,发出“假”。本质上,我需要知道源序列何时“空闲”一段时间。

来源:---1--------5-------2--------(超时)--------8-----3----- -> | | | | | | 输出:---true---true----true----false------------true--true--->

其实我不需要true的重复出现,这样就更好了:

来源:---1--------5--------2--------(超时)---------8-----3---- --> | | | 输出:---真--------假-------------真--------->

我见过this answer,但老实说,我真的不明白它是如何工作的。似乎应该有一个更简单的答案。

更糟糕的是,我确信我之前已经解决了这个确切的问题,但我不记得是如何解决的!有人可以帮忙吗?

【问题讨论】:

  • 链接的答案是正确的。希望在我的回答中更容易看到它是如何工作的。

标签: system.reactive rx.net


【解决方案1】:

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);

这给了我:

真的 真的 真的 错误的 真的 真的 错误的

【讨论】:

  • 感谢@Enigmativity。由于某种原因,我发现 Rx 操作员真的很难理解,但通常值得坚持。
  • @TimLong - 是的,我同意。我仍在努力解决其中的一个问题……
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多