首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 4.0 線程池新功能:合作式取消模式

     編輯:關於.NET

背景痛點

傳統 ThreadPool.QueueUserWorkItem 將工作交給線程池後,呼叫端完全失去控制權,無法中途取消執行中的工作。

.NET 4.0 解決方案:Cooperative Cancellation

新增 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 callback, object state, bool useSynchronizationContext);
}

完整範例代碼

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

運作流程

  1. 主執行緒建立 CancellationTokenSource,取得 Token 傳遞給工作項目。
  2. 工作項目定期檢查 token.IsCancellationRequested。
  3. 使用者按下 Enter,主執行緒呼叫 cts.Cancel() 設定取消旗標。
  4. 工作項目偵測到旗標,優雅結束迴圈並離開。

進階用法

  • token.ThrowIfCancellationRequested():偵測到取消時拋出 OperationCanceledException。
  • token.Register(callback):註冊取消回呼,自動處理清理邏輯。
  • token.WaitHandle:配合 WaitHandle.WaitAny 進行等待。

總結

合作式取消模式賦予開發者對線程池工作執行的精確控制力,是 .NET 4.0 並行程式設計的重要基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved