TaskCanceledException при вызове Task.Delay с CancellationToken в событии с клавиатурой

Я пытаюсь отложить обработку метода (SubmitQuery() в примере), вызванного из события клавиатуры в WinRT, до тех пор, пока в течение периода времени не будет никаких событий (в этом случае будет 500 мс).

Я хочу, чтобы функция SubmitQuery() запускалась, когда я думаю, что пользователь закончил набирать текст.

Используя следующий код, я продолжаю получать System.Threading.Tasks.TaskCanceledException, когда Task.Delay(500, cancelationToken.Token); называется. Что я делаю неправильно здесь, пожалуйста?

CancellationTokenSource cancellationToken = new CancellationTokenSource();

private async void SearchBox_QueryChanged(SearchBox sender, SearchBoxQueryChangedEventArgs args)
{

        cancellationToken.Cancel();
        cancellationToken = new CancellationTokenSource();

    await Task.Delay(500, cancellationToken.Token);

    if (!cancellationToken.IsCancellationRequested)
    {
        await ViewModel.SubmitQuery();
    }
}

Ответ 1

Чего ожидать. Когда вы отмените старый Delay, он вызовет исключение; как работает отмена. Вы можете поместить простой try/catch вокруг Delay, чтобы поймать ожидаемое исключение.

Обратите внимание, что если вы хотите использовать логику времени, подобную этой, Rx более естественна, чем async.

Ответ 2

Если вы добавляете ContinueWith() с пустым действием, исключение не выдается. Исключение перехватывается и передается task.Exception в ContinueWith()

await Task.Delay(500, cancellationToken.Token).ContinueWith(tsk => { });