我有一个类似于this one的问题。我需要以以下方式处理一系列用户输入事件(搜索):
除了取消之外,我的代码似乎几乎是这样工作的。
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)运行搜索。
由于某些原因,我找不到所有答案中提到的Switch()扩展。
我在使用System.Reactive和System.Reactive.Linq版本的4.0.0
我猜这种形式的Select()和Subscribe()不是上面代码中最好的解决方案。他们应该对Task进行手术.
是否知道如何改进上面的管道以支持必要的取消?
发布于 2018-10-25 18:41:28
我猜在这里,但是您可能有ExecuteSearch发送搜索字符串,获取结果,然后将它们绑定到UI。拆分ExecuteSearch以返回理想的IObservable<Results>或Task<Results>,以及处理UI绑定的新函数public void ApplySearchResults(Results r)。
一旦你有了它,这应该是可行的:
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>>上工作。你没有一个双观测的,只有一个,这就是为什么你没有看到它。
https://stackoverflow.com/questions/52991149
复制相似问题