Reactive Extensions Buffer执行EveryTime,与TimeSpan或count无关

时间:2015-05-07 09:22:43

标签: c# wpf system.reactive reactive-programming

我正在创建和搜索文本,并希望我的应用程序每2秒执行一次搜索,或者文本框中至少有3个字符。

我正在尝试使用Reactive Extension的缓冲区或限制来实现相同的目标。但我可能不清楚这两种方法是如何工作的。我正在尝试的代码是

var observableSequence = SearchQueryText.ToObservable();
observableSequence.Buffer(TimeSpan.FromSeconds(2),3).Subscribe(u =>
  {
      PerformSearch();
  });

对我来说,这些方法都不会等待2秒,也不会停止缓冲区以获得至少三个字符。

但是如果我使用" u"检查计数或平均值,然后返回正确的值。

我只是希望这些方法等待TimeSpan中指定的时间或等待字符达到指定的长度。

1 个答案:

答案 0 :(得分:2)

缓冲区的工作原理是,当达到计数限制或时间跨度已经过去时,传播结果。

你可能想要这样的东西:

 observableSequence
.Where(x => x.Length > 2)
.DistinctUntilChanged()
.CombineLatest(Observable.Timer(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(2)), (a, b) => a)
.Subscribe(x => Console.WriteLine(x), ex => Console.WriteLine(ex));

这将每2秒执行一次搜索,其中最新的搜索词符合长度标准。在至少有一个正确长度的搜索项之前,它将不执行任何操作。这就是你追求的目标吗?

或者你只是想确保搜索的执行时间不超过每2秒一次?

在哪种情况下:

sequenceObservable
.Where(x => !string.IsNullOrEmpty(x))
.Where(x => x.Length > 2)
.Throttle(TimeSpan.FromSeconds(2))
.DistinctUntilChanged()