Behebung unzuverlässiger Aufgabenabbrüche in WinRT
Die Verwendung von CancelNotification
zum Stoppen von WinRT-Aufgaben kann unzuverlässig sein; Die Methode scheint erfolgreich zu sein, die Aufgabe wird jedoch weiterhin ausgeführt. Dies führt häufig trotz des Abbruchversuchs zu einem abgeschlossenen Aufgabenstatus.
Ein robuster Stornierungsansatz
Die Lösung liegt im Verständnis der .NET-Kündigung und des Task-Based Asynchronous Pattern (TAP). TAP empfiehlt die Verwendung von CancellationToken
innerhalb asynchroner Methoden. Der entscheidende Schritt besteht darin, das CancellationToken
an jede stornierbare Methode zu übergeben und regelmäßige Überprüfungen in diese Methoden einzubinden.
Verbessertes Codebeispiel:
Dieser überarbeitete Code demonstriert den zuverlässigen Aufgabenabbruch mit await
:
<code class="language-csharp">private async Task TryTask() { var source = new CancellationTokenSource(); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); try { // Await the task; an exception is thrown if cancelled. await task; } catch (OperationCanceledException) { // Handle cancellation gracefully. Console.WriteLine("Task cancelled successfully."); } } private int slowFunc(int a, int b, CancellationToken cancellationToken) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { someString += i.ToString(); // Simulate long-running operation cancellationToken.ThrowIfCancellationRequested(); } return a + b; }</code>
Dieser Code verwendet CancellationToken
wie folgt:
await task
löst ein OperationCanceledException
aus, wenn die Aufgabe abgebrochen wird. Diese Ausnahme wird abgefangen und behandelt.cancellationToken.ThrowIfCancellationRequested()
inside slowFunc
prüft regelmäßig auf Stornierungsanfragen.ThrowIfCancellationRequested
wird eine Ausnahme ausgelöst und das Abbruchsignal im Aufrufstapel nach oben weitergeleitet.Dieser Ansatz gewährleistet einen zuverlässigen Abbruch await
bearbeiteter Aufgaben in WinRT, verhindert Hintergrundprozesse und bietet eine robustere Lösung.
Das obige ist der detaillierte Inhalt vonWie kann ich eine ausstehende Aufgabe in WinRT zuverlässig abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!