无论 TimeSpan 或计数如何,Reactive Extensions Buffer 每次都会执行

Reactive Extensions Buffer Executes EveryTime irrespective of TimeSpan or count

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

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

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

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

但是在缓冲区的情况下,如果我使用 "u" 检查计数或平均值,那么它 returns 正确的值。

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

缓冲区通过在达到计数限制或时间跨度已过时传播结果来工作。

您可能想要这样的东西:

 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 秒使用满足长度标准的最新搜索词执行一次搜索。在至少有 1 个正确长度的搜索词之前,它不会执行任何操作。这就是你想要的吗?

或者您只是想确保搜索的执行频率不超过每 2 秒一次?

在这种情况下:

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