Здравствуйте, 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.