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

Сообщение Re[7]: Reactive Extensions от 24.11.2019 15:16

Изменено 24.11.2019 18:03 Shmj

Re[7]: Reactive Extensions
Здравствуйте, Somescout, Вы писали:

S>У вас после нажатия на клавишу сразу без ожидания будет вызвана функция FillItems, которая сразу же сбросит этот флаг.


Ваша правда. Без счетчика запросов не обойтись:

        private volatile int _lastRequestId;

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            _lastRequestId++;
            FillItems();
        }

        private async void FillItems()
        {
            var requestId = _lastRequestId;

            await Task.Delay(500);

            if (requestId != _lastRequestId)
                return;

            textBox2.Clear();

            var items = await MakeRequest(textBox1.Text);

            if (_lastRequestId != requestId)
                return;

            textBox2.Text = string.Join("\r\n", items);
        }

        Random _random = new Random();
        private async Task<List<string>> MakeRequest(string q)
        {
            await Task.Delay(_random.Next(100, 5000));
            return await Task.FromResult(new List<string>()
            {
                q + " пункт 1 ",
                q + " пункт 2",
                q + " пункт 3",
            });
        }


Теперь ваш вариант на Reactive Extensions.
Re[7]: Reactive Extensions
Здравствуйте, Somescout, Вы писали:

S>У вас после нажатия на клавишу сразу без ожидания будет вызвана функция FillItems, которая сразу же сбросит этот флаг.


Ваша правда. Без счетчика запросов не обойтись:

        private volatile int _lastRequestId;

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            _lastRequestId++;
            FillItems();
        }

        private async void FillItems()
        {
            var requestId = _lastRequestId;

            await Task.Delay(500);

            if (requestId != _lastRequestId)
                return;

            textBox2.Clear();

            var items = await MakeRequest(textBox1.Text);

            if (_lastRequestId != requestId)
                return;

            textBox2.Text = string.Join("\r\n", items);
        }

        Random _random = new Random();
        private async Task<List<string>> MakeRequest(string q)
        {
            await Task.Delay(_random.Next(100, 5000));
            return await Task.FromResult(new List<string>()
            {
                q + " пункт 1 ",
                q + " пункт 2",
                q + " пункт 3",
            });
        }


Еще вариант с отменой:

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            FillItems();
        }

        private CancellationTokenSource _cancelTokenSource;

        private async void FillItems()
        {
            _cancelTokenSource?.Cancel(true);

            var cancelTokenSource = new CancellationTokenSource();

            _cancelTokenSource = cancelTokenSource;

            try
            {
                await Task.Delay(500, cancelTokenSource.Token);
                textBox2.Clear();

                var items = await MakeRequest(textBox1.Text, cancelTokenSource.Token);
                textBox2.Text = string.Join("\r\n", items);
            }
            catch (TaskCanceledException)
            {
            }
        }

        Random _random = new Random();
        private async Task<List<string>> MakeRequest(string q, CancellationToken cancellationToken)
        {
            await Task.Delay(_random.Next(100, 5000), cancellationToken);

            Console.Beep(1000, 10);

            return await Task.FromResult(new List<string>()
            {
                q + " пункт 1 ",
                q + " пункт 2",
                q + " пункт 3",
            });
        }


Теперь ваш вариант на Reactive Extensions.