0Pricing
C# Academy · บทเรียน

รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน

ส่งต่อและเคารพ CancellationToken: สร้าง CTS ตรวจสอบหรือโยนข้อยกเว้นเมื่อยกเลิก ส่งต่อให้ API แบบ async และทำความสะอาดด้วยการลงทะเบียน

รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

การยกเลิกแบบร่วมมือ

เป้าหมาย: ยกเลิกงานแบบ ร่วมมือกัน

  • สร้าง CancellationTokenSource
  • ส่งต่อ CancellationToken ลงไป
  • ตรวจสอบ IsCancellationRequested หรือเรียกใช้ ThrowIfCancellationRequested()
  • ตอบสนองต่อการยกเลิกอย่างรวดเร็วและเรียบร้อย

การยกเลิกโดยผู้เรียก

สร้าง CancellationTokenSource ส่งต่อโทเค็น และยกเลิกจากผู้เรียก ส่วนเมธอดที่ถูกเรียกจะโยน 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!");
    }
  }
}

การส่งต่อโทเค็น

ส่งต่อโทเค็นผ่านทุกชั้นของการทำงานแบบอะซิงโครนัส เพื่อให้การเรียกภายในหยุดได้อย่างทันท่วงที

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

การล้างทรัพยากรด้วย token.Register

ใช้ token.Register เพื่อผูกการทำงานล้างทรัพยากรขนาดเล็ก ซึ่งจะทำงานเมื่อมีการร้องขอให้ยกเลิก

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

แหล่งต้นทางที่เชื่อมโยง

CreateLinkedTokenSource รวมสัญญาณหลายรายการ เช่น การยกเลิกโดยผู้ใช้และการหมดเวลา ให้เป็นโทเค็นเดียว

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

แนวทางปฏิบัติที่ดี

เคล็ดลับ:

  • ส่งโทเค็นให้ API แบบอะซิงโครนัส เช่น Task.Delay และการดำเนินการรับส่งข้อมูล เพื่อให้หยุดได้อย่างทันท่วงที
  • โยน OperationCanceledException เพื่อจบงาน อย่าดักกลืนข้อยกเว้นนี้
  • เรียก Dispose กับ CancellationTokenSource หากแหล่งนี้เป็นเจ้าของตัวจับเวลาหรือการลงทะเบียน
  • ทำตัวจัดการให้ทำงานรวดเร็ว โดยทำงานให้น้อยที่สุดใน Register

กฎการยกเลิกแบบร่วมมือ

ตรวจสอบความเข้าใจอย่างรวดเร็ว: วิธีที่ถูกต้องที่เมธอดควรใช้เพื่อตอบสนองต่อคำขอยกเลิกคืออะไร

ทบทวน

ทบทวน: ทำให้การยกเลิกเป็นแบบร่วมมือกัน โดยส่งต่อโทเค็น ตรวจสอบสถานะหรือเรียกใช้ ThrowIfCancellationRequested ผูกการล้างทรัพยากรขนาดเล็ก และเชื่อมโยงแหล่งต้นทางสำหรับสัญญาณหลายรายการ

คำถามที่พบบ่อย

บทเรียน “รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน”

ส่งต่อและเคารพ CancellationToken: สร้าง CTS ตรวจสอบหรือโยนข้อยกเว้นเมื่อยกเลิก ส่งต่อให้ API แบบ async และทำความสะอาดด้วยการลงทะเบียน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน
  2. การหมดเวลา IProgress และทรัพยากร async (การจำลอง)
  3. พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม
← กลับไปที่ C# Academy