Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Somescout, Вы писали:
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>>>
S>>Тут уже в алгоритме ошибка: таймер ожидания должен сбрасываться после каждого нажатия клавиши, а у вас после первого нажатия через 500 мс запрос уйдёт в любом случае.
S>Нет, т.к. после 500 мс ожидания идет проверка. Если была нажата клавиша — будет установлен флаг _changed и выход из функции.
У вас после нажатия на клавишу сразу без ожидания будет вызвана функция FillItems, которая сразу же сбросит этот флаг.
S>>Более того, я могу ошибаться, но запрос будет отправлен по всем нажатиям клавиш, потому что не делается проверка что асинхронная функция уже была вызвана.
S>См. выше.
См. выше
ARI ARI ARI... Arrivederci!