У меня есть вопрос, похожий на этот .Мне нужно обработать последовательность событий пользовательского ввода (поисков) следующим образом:
- дросселировать каждую поисковую фразу с 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)
выполняет поиск.
Почему-то я не могу найти расширение Switch()
, упомянутое во всех ответах на SO ...
Я используюSystem.Reactive
и System.Reactive.Linq
в версии 4.0.0
Я полагаю, что Select()
и Subscribe()
в этой форме не лучшее решение в приведенном выше коде.Вероятно, они должны работать на Task
s ...
Есть идеи, как улучшить описанный выше конвейер для поддержки отмены при необходимости?