0Pricing
C# Academy · Aula

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

Verificação rápida: Qual é a forma correta de um método responder a uma solicitação de cancelamento?

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

  1. Padrões de CancellationToken; cancelamento cooperativo
  2. Limites de tempo, IProgress , descartáveis assíncronos (emulação)
  3. Fundamentos de resiliência: novas tentativas e recuo
← Voltar para C# Academy