Информация об изменениях

Сообщение Re[5]: Reactive Extensions от 24.11.2019 14:56

Изменено 24.11.2019 14:57 Shmj

Re[5]: Reactive Extensions
Здравствуйте, 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 мс запрос уйдёт в любом случае.


Нет, т.к. после 500 мс ожидания идет проверка. Если была нажата клавиша — будет установлен флаг _changed и выход из функции.

if (_changed)
   return;


S>Более того, я могу ошибаться, но запрос будет отправлен по всем нажатиям клавиш, потому что не делается проверка что асинхронная функция уже была вызвана.


См. выше.
Re[5]: Reactive Extensions
Здравствуйте, Somescout, Вы писали:

S>Тут уже в алгоритме ошибка: таймер ожидания должен сбрасываться после каждого нажатия клавиши, а у вас после первого нажатия через 500 мс запрос уйдёт в любом случае.


Нет, т.к. после 500 мс ожидания идет проверка. Если была нажата клавиша — будет установлен флаг _changed и выход из функции.

if (_changed)
   return;


S>Более того, я могу ошибаться, но запрос будет отправлен по всем нажатиям клавиш, потому что не делается проверка что асинхронная функция уже была вызвана.


См. выше.

Чтобы не гадать — запустите, это WinForms-приложение. 2 TextBox кинуть на форму и у первого TextBox подписка на textBox1_KeyUp.