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
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
- Pattern CancellationToken; annullamento cooperativo
- Timeout, IProgress , disposable asincroni (emulazione)
- Fondamenti di resilienza: retry e backoff