>我有一个与此类似的问题。我需要通过以下方式处理一系列用户输入事件(搜索(:
- 使用 N 毫秒限制每个搜索短语
- 如果搜索短语发生更改(并且即将运行新搜索(,则取消以前运行的搜索
- 仅应用最新搜索
除了取消之外,我的代码似乎几乎以这种方式工作。
Observable.FromEventPattern<TextChangedEventArgs>(
handler => SearchBox.TextChanged += handler,
handler => SearchBox.TextChanged -= handler)
.ObserveOn(SynchronizationContext.Current)
.Select(GetSearchQuery)
.Throttle(TimeSpan.FromMilliseconds(MinimumSearchIntervalMiliseconds))
.DistinctUntilChanged()
.Subscribe(ExecuteSearch, () => { });
string GetSearchQuery(EventPattern<TextChangedEventArgs>)
返回搜索字符串并void ExecuteSearch(string)
运行搜索。
由于某种原因,我找不到SO上所有答案中提到的Switch()
扩展名...
我在版本4.0.0
中使用System.Reactive
和System.Reactive.Linq
我想这种形式的Select()
和Subscribe()
并不是上面代码中的最佳解决方案。他们可能应该在Task
...
知道如何改进上面的管道以支持根据需要取消吗?
我在这里猜测,但您可能ExecuteSearch
发送搜索字符串,获取结果,然后将它们绑定到 UI。拆分ExecuteSearch
以返回理想的IObservable<Results>
或Task<Results>
,并public void ApplySearchResults(Results r)
一个新函数来处理 UI 绑定。
一旦你有了它,这应该可以工作:
Observable.FromEventPattern<TextChangedEventArgs>(
handler => SearchBox.TextChanged += handler,
handler => SearchBox.TextChanged -= handler)
.ObserveOn(SynchronizationContext.Current)
.Select(GetSearchQuery)
.Throttle(TimeSpan.FromMilliseconds(MinimumSearchIntervalMiliseconds))
.DistinctUntilChanged()
.Select(ExecuteSearch /* .ToObservable() if it returns Task<Results>/*)
.Switch()
.Subscribe(ApplyResults, () => { })
.Switch
适用于IObservable<IObservable<T>>
.你没有一个双重可观察的,只有一个,这就是为什么你没有看到它。