Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, okon, Вы писали:
O>>Очень простая задача встречающаяся практически в любом интерфейсе — нужно отобразить список Items[] GetList(string filter) который формируется долго, задержка плавающая т.е. может от 0.1 секунды ответ прийти до 5 секунд, пользователь вводит данные в поле filter, запрос сразу отправлять не требуется, только после 500 миллисекунд после того как пользователь перестал вводить данные. Нужно отображать актуальный список в UI соотвествующий последнему введеному filter.
S>Примерно так (набросал идею):
S>S> private volatile bool _changed;
S> private void textBox1_KeyUp(object sender, KeyEventArgs e)
S> {
S> _changed = true;
S> FillItems();
S> }
S> private async void FillItems()
S> {
S> _changed = false;
S> await Task.Delay(500);
S> if (_changed)
S> return;
S> textBox2.Clear();
S> var items = await MakeRequest(textBox1.Text);
S> if (_changed)
S> return;
S> textBox2.Text = string.Join("\r\n", items);
S> }
S> Random _random = new Random();
S> private async Task<List<string>> MakeRequest(string q)
S> {
S> await Task.Delay(_random.Next(100, 5000));
S> return await Task.FromResult(new List<string>()
S> {
S> q + "пункт 1 ",
S> q + "пункт 2",
S> q + "пункт 3",
S> });
S> }
S>
Тут уже в алгоритме ошибка: таймер ожидания должен сбрасываться после каждого нажатия клавиши, а у вас после первого нажатия через 500 мс запрос уйдёт в любом случае. Более того, я могу ошибаться, но запрос будет отправлен по всем нажатиям клавиш, потому что не делается проверка что асинхронная функция уже была вызвана.
ARI ARI ARI... Arrivederci!