Я пишу пользовательский интерфейс, в котором пользователь может вводить поисковый запрос, а список постоянно обновляется, предлагая предложения.
Моей первой мыслью было то, что примитивная дроссельная заслонка Rx была идеальным вариантом, но она принесла мне половину результата.
На получение предложений требуется время, поэтому я получаю их асинхронно, а не в потоке пользовательского интерфейса.
Проблема в том, что я хочу отбросить / пропустить / выбросить результат, если пользователь снова наберет интервал времени дроссельной заслонки.
Например:
- Время начинается, и пользователь нажимает клавишу: 0 мс
- Дроссельная заслонка установлена на 100 мс.
- Получение занимает 200 мс.
- Через 150 мс пользователь нажал другую клавишу
Теперь с помощью Throttle первая выборка по-прежнему будет продолжаться, чтобы заполнить список предложений графического интерфейса. Мне нравится узнавать, как я могу отменить эту первую выборку, если она больше не актуальна? Только второе нажатие клавиши должно вызвать обновление графического интерфейса.
Вот что я пробовал
(Я использую ReactiveUI, но вопрос о Rx)
public IEnumerable<usp_getOpdrachtgevers_Result> Results { get; set; } // [Reactive] pu
public SearchOpdrachtgeverVM()
{
this.WhenAnyValue(x => x.FirstName,
x => x.LastName
)
.Throttle(TimeSpan.FromMilliseconds(200))
.Subscribe(async vm => Results = await PopulateGrid());
}
private async Task<IEnumerable<usp_getOpdrachtgevers_Result>> PopulateGrid()
{
return await Task.Run(
() => _opdrachtgeversCache
.Where(x =>
x.vNaam.Contains(FirstName)
&& x.vLastName.Contains(LastName)
)
);
}