รูปแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน
- การหมดเวลา IProgress และทรัพยากร async (การจำลอง)
- พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม