2015-05-07 21 views
1

我正在创建和搜索文本,并希望我的应用程序每2秒执行一次搜索,或者文本框中至少有3个字符。无功扩展无论TimeSpan或计数如何,每次都执行缓冲区

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

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

对我来说没有这些方法等待2秒钟也没有缓冲停止得到它ATLEAST三个字符。

但是如果使用“u”来检查计数或平均值,那么它会返回正确的值。

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

回答

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秒与满足长度标准的最近搜索项。除非有至少1个正确长度的搜索词,否则它什么也不做。那是你之后的事情吗?

或者你只是希望确保搜索不超过每2秒执行一次?

在这种情况下:

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