TaskCanceledException bei der aufrufenden Task.Verzögerung mit einem CancellationToken in ein Tastatur-Ereignis
Ich versuche zu verzögern die Bearbeitung einer Methode (SubmitQuery() in dem Beispiel) aufgerufen, die ein Tastatur-Ereignis in WinRT, bis es keine weiteren Veranstaltungen für einen Zeitraum (500 MS in diesem Fall).
Ich will nur SubmitQuery() zu laufen, wenn ich denke, dass der Benutzer fertig mit der Eingabe.
Mithilfe des folgenden Codes, bekomme ich immer eine System.Threading.Aufgaben.TaskCanceledException bei der Aufgabe.Delay(500, cancellationToken.Token); aufgerufen wird. Was mache ich hier falsch bitte?
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();
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rechnen. Beim Abbrechen der alten
Delay
es wird eine Ausnahme ausgelöst; das ist, wie die Stornierung funktioniert. Sie können eine einfachetry
/catch
rund um dieDelay
fangen die erwartete Ausnahme.Beachten Sie, dass wenn Sie wollen, um Zeit-basierte Logik wie dieser Rx ist eine Natürliche Passform als
async
.Wenn Sie hinzufügen
ContinueWith()
mit einer leeren actiondie exception nicht geworfen wird.Die exception wird gefangen und an dentask.Exception
Eigenschaft in derContinueWith()
. Aber Es erspart Ihnen das schreiben eines try/catch, die verunstalten Ihren code..Delay
Situationen, die wir erwarten der token aufgehoben werden, so dass die Ausnahme gar nicht erhoben/gefangen, und diesen festen ist, dass Sie perfekt.Task<TResult> tsk
argument..ContinueWith(tsk => tsk.Exception);
Diese Weise die Fortsetzung der Aufgabe kann die Ausnahme behandeln. In diesem Fall sind wir nicht....