傳統 ThreadPool.QueueUserWorkItem 將工作交給線程池後,呼叫端完全失去控制權,無法中途取消執行中的工作。
新增 System.Threading.CancellationTokenSource 與 CancellationToken,建立「要求取消」與「回應取消」的協作機制。
public sealed class CancellationTokenSource : IDisposable {
public CancellationTokenSource();
public void Dispose();
public bool IsCancellationRequested { get; }
public CancellationToken Token { get; }
public void Cancel();
public void Cancel(bool throwOnFirstException);
}
public struct CancellationToken {
public bool IsCancellationRequested { get; }
public void ThrowIfCancellationRequested();
public WaitHandle WaitHandle { get; }
public static CancellationToken None { get; }
public bool CanBeCanceled { get; }
public CancellationTokenRegistration Register(Action
using System;
using System.Threading;
namespace CooperativeCancellation
{
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
ThreadPool.QueueUserWorkItem(o => ExecuteInThreadPool(cts.Token));
Console.WriteLine("Press <Enter> to cancel the operation.");
Console.ReadLine();
cts.Cancel(); // 發出取消請求
Console.ReadLine();
}
static void ExecuteInThreadPool(CancellationToken token)
{
Console.WriteLine("Enter in ThreadPool.");
while (!token.IsCancellationRequested)
{
Console.Write(" .");
Thread.Sleep(1000);
}
Console.WriteLine("Operation was cancelled.");
}
}
}
CancellationTokenSource,取得 Token 傳遞給工作項目。token.IsCancellationRequested。cts.Cancel() 設定取消旗標。token.ThrowIfCancellationRequested():偵測到取消時拋出 OperationCanceledException。token.Register(callback):註冊取消回呼,自動處理清理邏輯。token.WaitHandle:配合 WaitHandle.WaitAny 進行等待。合作式取消模式賦予開發者對線程池工作執行的精確控制力,是 .NET 4.0 並行程式設計的重要基石。