Asyn c Task.Delay CancellationToken - PullRequest
       73

Asyn c Task.Delay CancellationToken

1 голос
/ 11 апреля 2020

Я искал способ отложить дорогой поиск в событии TextChanged. Следующий код ждет 300 мс после того, как пользователь закончил печатать, а затем выполняет поиск.

    Task.Delay(TimeSpan.FromMilliseconds(300), this.throttleCts.Token) // if no keystroke occurs, carry on after 500ms
            .ContinueWith(
                delegate { PerformSearch(e.NewText); }, 
                CancellationToken.None,
                TaskContinuationOptions.OnlyOnRanToCompletion,
                TaskScheduler.FromCurrentSynchronizationContext());

Существует ли более элегантный эквивалентный асинхронный / ожидающий код для приведенного выше примера?

Я заменил на это, но это вызывает TaskCanceledException

    await Task.Delay(300, this.throttleCts.Token);
    PerformSearch(e.NewText);

1 Ответ

2 голосов
/ 11 апреля 2020

Стандартный способ asyn c -wait - это поймать OperationCanceledException.

private async void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    try
    {
        await Task.Delay(300, this.throttleCts.Token);
    }
    catch (OperationCanceledException)
    {
        return;
    }
    PerformSearch(e.NewText);
}
...