0Pricing
C# Academy · Lektion

CancellationToken-Muster und kooperative Abbrüche

Übergeben und beachten Sie CancellationToken: Erstellen Sie CTS, prüfen Sie auf Abbruch oder lösen Sie ihn aus, übergeben Sie ihn an asynchrone APIs und räumen Sie Registrierungen auf.

CancellationToken-Muster und kooperative Abbrüche ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Kooperativer Abbruch

Ziel: Brechen Sie die Arbeit kooperativ ab.

  • Erstellen Sie eine CancellationTokenSource
  • Reichen Sie CancellationToken weiter
  • Prüfen Sie IsCancellationRequested oder rufen Sie ThrowIfCancellationRequested() auf
  • Reagieren Sie schnell und sauber auf den Abbruch

Vom Aufrufer gesteuerter Abbruch

Erstellen Sie eine CancellationTokenSource, reichen Sie das Token weiter und lösen Sie den Abbruch vom Aufrufer aus; die aufgerufene Methode wirft OperationCanceledException.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task WorkAsync(CancellationToken ct)
  {
    // Poll occasionally; throw to end cooperatively
    for (int i = 0; i < 5; i++)
    {
      ct.ThrowIfCancellationRequested();
      Console.WriteLine("Step " + i);
      await Task.Delay(100, ct); // pass token to async API
    }
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    Task t = WorkAsync(cts.Token);

    // Cancel after a short delay (simulated user action)
    Thread.Sleep(180);
    cts.Cancel();

    try
    {
      t.GetAwaiter().GetResult();
    }
    catch (OperationCanceledException)
    {
      Console.WriteLine("Canceled!");
    }
  }
}

Token weiterreichen

Reichen Sie das Token durch jede asynchrone Ebene weiter, damit innere Aufrufe umgehend beendet werden können.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> FetchAsync(CancellationToken ct)
  {
    await Task.Delay(80, ct); // pretend I/O
    ct.ThrowIfCancellationRequested();
    return "data";
  }

  static async Task<string> ProcessAsync(CancellationToken ct)
  {
    string raw = await FetchAsync(ct); // forward token
    await Task.Delay(80, ct);
    return raw.ToUpperInvariant();
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    Task<string> job = ProcessAsync(cts.Token);
    cts.CancelAfter(100); // schedule a cancellation
    try
    {
      Console.WriteLine(job.GetAwaiter().GetResult());
    }
    catch (OperationCanceledException)
    {
      Console.WriteLine("Pipeline canceled");
    }
  }
}

Bereinigung mit token.Register

Verwenden Sie token.Register, um eine kleine Bereinigungsaktion zu registrieren, die ausgeführt wird, sobald ein Abbruch angefordert wurde.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task UseRegistrationAsync(CancellationToken ct)
  {
    using (ct.Register(() => Console.WriteLine("Cleanup: releasing temp resources")))
    {
      for (int i = 0; i < 3; i++)
      {
        ct.ThrowIfCancellationRequested();
        await Task.Delay(120, ct);
        Console.WriteLine("Tick " + i);
      }
    }
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    Task t = UseRegistrationAsync(cts.Token);
    Thread.Sleep(150);
    cts.Cancel();
    try { t.GetAwaiter().GetResult(); }
    catch (OperationCanceledException) { Console.WriteLine("Canceled with cleanup"); }
  }
}

Verknüpfte Quellen

CreateLinkedTokenSource führt mehrere Signale (z. B. Abbruch durch den Benutzer und Timeout) zu einem einzelnen Token zusammen.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task WorkAsync(CancellationToken ct)
  {
    await Task.Delay(500, ct);
    Console.WriteLine("Finished work");
  }

  public static void Main(string[] args)
  {
    var parent = new CancellationTokenSource();
    var timeout = new CancellationTokenSource();
    timeout.CancelAfter(200);

    // Link both sources: cancel if parent OR timeout requests
    var linked = CancellationTokenSource.CreateLinkedTokenSource(parent.Token, timeout.Token);

    Task t = WorkAsync(linked.Token);
    try { t.GetAwaiter().GetResult(); }
    catch (OperationCanceledException) { Console.WriteLine("Canceled by parent/timeout"); }
    finally { linked.Dispose(); parent.Dispose(); timeout.Dispose(); }
  }
}

Bewährte Vorgehensweisen

Tipps:

  • Reichen Sie Token an asynchrone APIs (Task.Delay, I/O) weiter, damit diese umgehend beendet werden.
  • Lösen Sie OperationCanceledException aus, um die Arbeit zu beenden; unterdrücken Sie sie nicht.
  • Geben Sie CancellationTokenSource frei, wenn sie Timer oder Registrierungen verwaltet.
  • Halten Sie Handler kurz; erledigen Sie in Register nur das Nötigste.

Regel für kooperativen Abbruch

Schnelltest: Wie sollte eine Methode korrekt auf eine Abbruchanforderung reagieren?

Zusammenfassung

Zusammenfassung: Machen Sie Abbrüche kooperativ – reichen Sie Token weiter, prüfen Sie den Status oder rufen Sie ThrowIfCancellationRequested auf, registrieren Sie eine kleine Bereinigung und verknüpfen Sie Quellen für kombinierte Signale.

Häufig gestellte Fragen

Ist die Lektion „CancellationToken-Muster und kooperative Abbrüche“ kostenlos?

Ja — der vollständige Text von „CancellationToken-Muster und kooperative Abbrüche“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Was lerne ich in „CancellationToken-Muster und kooperative Abbrüche“?

Übergeben und beachten Sie CancellationToken: Erstellen Sie CTS, prüfen Sie auf Abbruch oder lösen Sie ihn aus, übergeben Sie ihn an asynchrone APIs und räumen Sie Registrierungen auf. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 3.

Wie lange dauert die Lektion „CancellationToken-Muster und kooperative Abbrüche“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. CancellationToken-Muster und kooperative Abbrüche
  2. Timeouts, IProgress und asynchrone Disposables (Emulation)
  3. Grundlagen der Resilienz: Wiederholungen und Backoff
← Zurück zu C# Academy