0Pricing
C# Academy · Pelajaran

Pola CancellationToken; pembatalan kooperatif

Teruskan dan hormati CancellationToken: buat CTS, periksa/lempar saat pembatalan, teruskan ke API async, dan bersihkan dengan registrasi.

Pola CancellationToken; pembatalan kooperatif adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Pembatalan kooperatif

Tujuan: Membatalkan pekerjaan secara kooperatif.

  • Buat CancellationTokenSource
  • Teruskan CancellationToken ke lapisan di bawahnya
  • Periksa IsCancellationRequested atau panggil ThrowIfCancellationRequested()
  • Tangani pembatalan dengan cepat dan bersih

Pembatalan dipicu pemanggil

Buat CancellationTokenSource, teruskan token, lalu batalkan dari pemanggil; metode yang dipanggil melempar 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!");
    }
  }
}

Meneruskan token

Teruskan token melalui setiap lapisan asinkron agar pemanggilan di dalamnya dapat segera berhenti.

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

Pembersihan dengan token.Register

Gunakan token.Register untuk memasang tindakan pembersihan kecil yang dijalankan saat pembatalan diminta.

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

Sumber tertaut

CreateLinkedTokenSource menggabungkan beberapa sinyal (misalnya, pembatalan oleh pengguna + batas waktu) menjadi satu 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(); }
  }
}

Praktik terbaik

Kiat:

  • Teruskan token ke API asinkron (Task.Delay, I/O) agar API tersebut dapat segera berhenti.
  • Lempar OperationCanceledException untuk mengakhiri pekerjaan; jangan menelannya.
  • Buang CancellationTokenSource jika sumber tersebut memiliki pengatur waktu atau pendaftaran.
  • Jaga agar penangan tetap cepat; lakukan pekerjaan seminimal mungkin di dalam Register.

Aturan pembatalan kooperatif

Pemeriksaan singkat: Bagaimana cara yang benar bagi suatu metode untuk merespons permintaan pembatalan?

Ringkasan

Ringkasan: Jadikan pembatalan kooperatif—teruskan token, lakukan pemeriksaan berkala atau panggil ThrowIfCancellationRequested, pasang pembersihan kecil, dan tautkan sumber untuk menggabungkan beberapa sinyal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola CancellationToken; pembatalan kooperatif” gratis?

Ya — teks lengkap “Pola CancellationToken; pembatalan kooperatif” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Pola CancellationToken; pembatalan kooperatif”?

Teruskan dan hormati CancellationToken: buat CTS, periksa/lempar saat pembatalan, teruskan ke API async, dan bersihkan dengan registrasi. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 3.

Berapa lama pelajaran “Pola CancellationToken; pembatalan kooperatif” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pola CancellationToken; pembatalan kooperatif
  2. Batas waktu, IProgress , disposable async (emulasi)
  3. Dasar-dasar ketahanan: percobaan ulang & jeda bertahap
← Kembali ke C# Academy