Я пытаюсь реализовать адаптивное текстовое поле поиска, в котором результаты поиска обновляются по мере того, как пользователь вводит текст для поиска. Я пытаюсь сделать это с помощью Задач, но иногда обнаруживаю, что предыдущий поиск завершается после более позднего поиска, тем самым заменяя новые результаты старыми.
Одно быстрое решение - отложить запуск поиска после того, как пользователь перестал печатать на полсекунды или около того. Однако я думаю, что это только скрывает проблему. Я хотел бы найти общее решение.
До сих пор я придумал следующий класс:
public class LastAddedTaskStrategy<T>
{
private DateTime latest;
public T Result { get; private set; }
public async Task Add(Task<T> t)
{
var timestamp = DateTime.Now;
latest = timestamp;
var currentResult = await t;
if (timestamp >= latest)
Result = currentResult;
}
}
Идея состоит в том, что вы можете добавить (и ожидать) как много Задач, сколько вы хотите (например, поиск), но побеждают только результаты последней добавленной (не последней выполненной) Задачи. Таким образом, если предыдущий поиск завершился после более позднего поиска, свойство Results
не будет обновлено, потому что это старый результат.
Это хорошее решение или есть что-то получше?