8

Sto tentando di ritardare l'elaborazione di un metodo (SubmitQuery() nell'esempio) chiamato da un evento di tastiera in WinRT fino a quando non si sono verificati ulteriori eventi per un periodo di tempo (500ms in questo caso).TaskCanceledException quando si chiama Task.Delay con un CancellationToken in un evento di tastiera

Voglio solo SubmitQuery() da eseguire quando penso che l'utente abbia finito di digitare.

Utilizzando il codice seguente, continuo a ricevere System.Threading.Tasks.TaskCanceledException quando Task.Delay (500, cancellationToken.Token); è chiamato. Cosa sto facendo di sbagliato qui per favore?

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(); 
    } 
} 

risposta

11

Questo è normale. Quando si annulla il vecchio Delay, si genera un'eccezione; è così che funziona la cancellazione. È possibile inserire un semplice try/catch attorno allo Delay per rilevare l'eccezione prevista.

Si noti che se si desidera eseguire una logica basata sul tempo come questa, Rx è un adattamento più naturale di async.

+0

hai potuto fornire link per alcune risorse su come Rx è più adatta per il tempo a base di logica – Anupam

+2

@Anupam: Questa è la mia esperienza. –

25

Se si aggiunge ContinueWith() con un'azione vuota, l'eccezione non viene generata.

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

È fantastico, grazie. Salva qualche brutto codice try/catch :) –

+1

Grazie per questo! Molto fastidioso nel debugger anche se viene catturato. Penso che in queste situazioni di ".Delay" ci aspettiamo ** che il token venga cancellato, quindi l'eccezione non dovrebbe nemmeno essere rilevata/catturata, e ciò è stato risolto perfettamente. –