Rx.NET 取消限制



>我有一个与此类似的问题。我需要通过以下方式处理一系列用户输入事件(搜索(:

  • 使用 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.ReactiveSystem.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>>.你没有一个双重可观察的,只有一个,这就是为什么你没有看到它。

相关内容

  • 没有找到相关文章

最新更新