我正在创建和搜索文本,并希望我的应用程序每2秒执行一次搜索,或者文本框中至少有3个字符。
我正在尝试使用Reactive Extension的缓冲区或限制来实现相同的目标。但我可能不清楚这两种方法是如何工作的。我正在尝试的代码是
var observableSequence = SearchQueryText.ToObservable();
observableSequence.Buffer(TimeSpan.FromSeconds(2),3).Subscribe(u =>
{
PerformSearch();
});
对我来说,这些方法都不会等待2秒,也不会停止缓冲区以获得至少三个字符。
但是如果我使用" u"检查计数或平均值,然后返回正确的值。
我只是希望这些方法等待TimeSpan中指定的时间或等待字符达到指定的长度。
答案 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()