ได้เลย 😎 เรามาเรียน CancellationToken
ใน C# / .NET แบบเข้าใจง่าย พร้อมตัวอย่างจริง
1️⃣ CancellationToken
คืออะไร?
-
CancellationToken ใช้สำหรับ ยกเลิกการทำงานของ Task / Async Method ก่อนที่จะเสร็จ
-
มักใช้ใน งานที่ใช้เวลาเยอะ หรือเป็น Background Task
-
ทำให้เราควบคุมการทำงานได้ เช่น ยกเลิก download, query database, หรือ long-running task
2️⃣ การสร้าง CancellationToken
using System.Threading;
var cts = new CancellationTokenSource(); // สร้าง CancellationTokenSource
CancellationToken token = cts.Token; // ดึง Token
// ยกเลิกหลัง 3 วินาที
cts.CancelAfter(3000);
3️⃣ ใช้ CancellationToken กับ Task
using System;
using System.Threading;
using System.Threading.Tasks;
async Task DoWorkAsync(CancellationToken token)
{
for (int i = 0; i < 10; i++)
{
token.ThrowIfCancellationRequested(); // เช็คว่ามีการยกเลิกหรือยัง
Console.WriteLine($"Working... {i}");
await Task.Delay(1000); // Simulate งานที่ใช้เวลา
}
Console.WriteLine("Work completed!");
}
var cts = new CancellationTokenSource();
var task = DoWorkAsync(cts.Token);
// ยกเลิกหลัง 3 วินาที
cts.CancelAfter(3000);
try
{
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("Task was cancelled!");
}
Output ตัวอย่าง:
Working... 0
Working... 1
Working... 2
Task was cancelled!
4️⃣ ใช้ CancellationToken กับ HTTP Requests
using System.Net.Http;
var cts = new CancellationTokenSource();
var client = new HttpClient();
cts.CancelAfter(2000); // ยกเลิกหลัง 2 วินาที
try
{
var response = await client.GetAsync("https://httpbin.org/delay/5", cts.Token);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
catch (OperationCanceledException)
{
Console.WriteLine("HTTP request was cancelled!");
}
-
เหมาะสำหรับงาน network, IO, database query ที่อาจช้า
5️⃣ สรุป
-
CancellationToken
→ ใช้ ยกเลิก Async/Task -
สร้างด้วย
CancellationTokenSource
-
ส่ง Token ไปยัง Method หรือ Task
-
เช็คการยกเลิกด้วย
token.ThrowIfCancellationRequested()
-
ใช้กับ HTTP, DB, Task, CQRS CommandHandler เพื่อให้สามารถหยุดงานได้อย่างปลอดภัย
ถ้าคุณอยาก ฉันสามารถทำ ตัวอย่างรวม CancellationToken + ICommandHandler + Guard ให้เห็นว่า ยกเลิกคำสั่งก่อนเข้ามือ Handler แบบ CQRS ได้เลย
คุณอยากให้ทำไหม?