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 => { });