0Pricing
C# Academy · Lezione

Pattern CancellationToken; annullamento cooperativo

Passate e rispettate CancellationToken: create CTS, controllate o sollevate l’annullamento, passatelo alle API asincrone e completate la pulizia con le registrazioni.

Pattern CancellationToken; annullamento cooperativo è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Annullamento cooperativo

Obiettivo: annulli il lavoro in modo cooperativo.

  • Crei una CancellationTokenSource
  • Passi il CancellationToken ai livelli inferiori
  • Controlli IsCancellationRequested oppure chiami ThrowIfCancellationRequested()
  • Gestisca l'annullamento in modo rapido e ordinato

Annullamento gestito dal chiamante

Crei una CancellationTokenSource, passi il token e annulli dal chiamante; il metodo chiamato genera 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!");
    }
  }
}

Inoltro dei token

Inoltri il token attraverso ogni livello asincrono, così le chiamate interne possono interrompersi rapidamente.

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

Pulizia con token.Register

Usi token.Register per associare una piccola azione di pulizia che viene eseguita quando viene richiesta l'annullamento.

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

Sorgenti collegate

CreateLinkedTokenSource unisce più segnali (ad es. annullamento da parte dell'utente e timeout) in un unico 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(); }
  }
}

Buone pratiche

Suggerimenti:

  • Passi i token alle API asincrone (Task.Delay, I/O), affinché si interrompano rapidamente.
  • Lanci OperationCanceledException per terminare il lavoro; non la ignori.
  • Rilasci CancellationTokenSource se gestisce timer o registrazioni.
  • Mantenga rapidi gli handler; esegua il minimo indispensabile in Register.

Regola per l'annullamento cooperativo

Verifica rapida: qual è il modo corretto con cui un metodo deve rispondere a una richiesta di annullamento?

Riepilogo

Riepilogo: renda l'annullamento cooperativo: passi i token, esegua il polling o chiami ThrowIfCancellationRequested, associ una piccola azione di pulizia e colleghi le sorgenti per combinare più segnali.

Domande Frequenti

La lezione «Pattern CancellationToken; annullamento cooperativo» è gratuita?

Sì — il testo completo di «Pattern CancellationToken; annullamento cooperativo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Pattern CancellationToken; annullamento cooperativo»?

Passate e rispettate CancellationToken: create CTS, controllate o sollevate l’annullamento, passatelo alle API asincrone e completate la pulizia con le registrazioni. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 3.

Quanto tempo richiede la lezione «Pattern CancellationToken; annullamento cooperativo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Pattern CancellationToken; annullamento cooperativo
  2. Timeout, IProgress , disposable asincroni (emulazione)
  3. Fondamenti di resilienza: retry e backoff
← Torna a C# Academy