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