C# Academy · Lektion

Mönster för CancellationToken; kooperativ avbrytning

Skicka och respektera CancellationToken: skapa CTS, kontrollera och kasta vid avbrytning, skicka token till asynkrona API:er och städa med registreringar.

Lektion 1 av 38 steg

Mönster för CancellationToken; kooperativ avbrytning är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.

Kooperativ avbrytning

Mål: Avbryt arbete kooperativt.

  • Skapa en CancellationTokenSource
  • Skicka vidare CancellationToken
  • Kontrollera IsCancellationRequested eller anropa ThrowIfCancellationRequested()
  • Respektera avbrytningen snabbt och ordnat

Avbrytning från anroparen

Skapa en CancellationTokenSource, skicka token och avbryt från anroparen; den anropade metoden kastar 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!");
    }
  }
}

Vidarebefordra tokens

Vidarebefordra token genom varje asynkront lager så att inre anrop kan stoppas snabbt.

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

Rensning med token.Register

Använd token.Register för att koppla till en liten rensningsåtgärd som körs när avbrytning begärs.

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

Länkade källor

CreateLinkedTokenSource slår ihop flera signaler (t.ex. avbrytning från användaren och timeout) till en enda token.

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

Bästa praxis

Tips:

  • Skicka tokens till asynkrona API:er (Task.Delay, I/O) så att de stoppas snabbt.
  • Kasta OperationCanceledException för att avsluta arbetet; svälj inte undantaget.
  • Anropa Dispose på CancellationTokenSource om den äger timers eller registreringar.
  • Håll hanterare snabba; utför minimalt arbete i Register.

Regel för kooperativ avbrytning

Snabb kontroll: Vilket är det korrekta sättet för en metod att reagera på en begäran om avbrytning?

Sammanfattning

Sammanfattning: Gör avbrytningen kooperativ – skicka tokens, kontrollera dem eller anropa ThrowIfCancellationRequested, koppla till små rensningsåtgärder och länka källor för kombinerade signaler.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Mönster för CancellationToken; kooperativ avbrytning” gratis?

Ja – hela texten till ”Mönster för CancellationToken; kooperativ avbrytning” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”Mönster för CancellationToken; kooperativ avbrytning”?

Skicka och respektera CancellationToken: skapa CTS, kontrollera och kasta vid avbrytning, skicka token till asynkrona API:er och städa med registreringar. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 3.

Hur lång tid tar lektionen ”Mönster för CancellationToken; kooperativ avbrytning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Mönster för CancellationToken; kooperativ avbrytning
  2. Tidsgränser, IProgress och asynkrona disposables (emulering)
  3. Grunderna i motståndskraft: omförsök och backoff
← Tillbaka till C# Academy