Heim > Backend-Entwicklung > C++ > Wie kann ich eine ausstehende Aufgabe in WinRT zuverlässig abbrechen?

Wie kann ich eine ausstehende Aufgabe in WinRT zuverlässig abbrechen?

Linda Hamilton
Freigeben: 2025-01-26 12:51:09
Original
763 Leute haben es durchsucht

How Can I Reliably Cancel an Awaitable Task in WinRT?

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>
Nach dem Login kopieren

Dieser Code verwendet CancellationToken wie folgt:

  • Ausnahmebehandlung: await task löst ein OperationCanceledException aus, wenn die Aufgabe abgebrochen wird. Diese Ausnahme wird abgefangen und behandelt.
  • Regelmäßige Stornierungsprüfungen: cancellationToken.ThrowIfCancellationRequested() inside slowFunc prüft regelmäßig auf Stornierungsanfragen.
  • Graceful Cancellation: Wenn ein Abbruch erkannt wird, ThrowIfCancellationRequested wird eine Ausnahme ausgelöst und das Abbruchsignal im Aufrufstapel nach oben weitergeleitet.

Dieser Ansatz gewährleistet einen zuverlässigen Abbruch awaitbearbeiteter 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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage