Re[6]: Reactive Extensions
От: Somescout  
Дата: 24.11.19 14:57
Оценка:
Здравствуйте, 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!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.