Padrões de CancellationToken; cancelamento cooperativo
Passe e respeite CancellationToken: crie CTS, verifique ou lance exceções para cancelar, passe o token a APIs assíncronas e faça a limpeza com registros.
Padrões de CancellationToken; cancelamento cooperativo é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Cancelamento cooperativo
Objetivo: Cancele o trabalho de forma cooperativa.
- Crie uma CancellationTokenSource
- Encaminhe o CancellationToken
- Verifique IsCancellationRequested ou chame ThrowIfCancellationRequested()
- Respeite o cancelamento de forma rápida e limpa
Cancelamento controlado pelo chamador
Crie uma CancellationTokenSource, passe o token e cancele a partir do chamador; o método chamado lança 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!");
}
}
}
Encaminhamento de tokens
Encaminhe o token por todas as camadas async para que as chamadas internas possam parar prontamente.
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");
}
}
}
Limpeza com token.Register
Use token.Register para associar uma pequena ação de limpeza que será executada quando o cancelamento for solicitado.
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"); }
}
}
Fontes vinculadas
CreateLinkedTokenSource combina vários sinais (por exemplo, cancelamento do usuário + tempo limite) em um único 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(); }
}
}
Boas práticas
Dicas:
- Passe tokens para APIs async (Task.Delay, E/S) para que parem prontamente.
- Lance OperationCanceledException para encerrar o trabalho; não a ignore.
- Use Dispose em CancellationTokenSource se ela for responsável por temporizadores ou registros.
- Mantenha os manipuladores rápidos; faça o mínimo de trabalho em Register.
Regra do cancelamento cooperativo
Resumo
Resumo: Torne o cancelamento cooperativo — passe tokens, faça sondagem ou use ThrowIfCancellationRequested, associe uma pequena ação de limpeza e vincule fontes para combinar sinais.
Perguntas Frequentes
A aula “Padrões de CancellationToken; cancelamento cooperativo” é grátis?
Sim — o texto completo de “Padrões de CancellationToken; cancelamento cooperativo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Padrões de CancellationToken; cancelamento cooperativo”?
Passe e respeite CancellationToken: crie CTS, verifique ou lance exceções para cancelar, passe o token a APIs assíncronas e faça a limpeza com registros. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 3.
Quanto tempo leva a aula “Padrões de CancellationToken; cancelamento cooperativo”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Padrões de CancellationToken; cancelamento cooperativo
- Limites de tempo, IProgress , descartáveis assíncronos (emulação)
- Fundamentos de resiliência: novas tentativas e recuo