程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET4.0線程池的Cooperative Cancellation模式

.NET4.0線程池的Cooperative Cancellation模式

編輯:關於.NET

剛裝了VS2010RC版,體驗一下.NET4.0線程池新增的Cooperative Cancellation模式。

用過.NET線程池的人都知道,一旦把要執行的代碼交給線程池去執行後,我們 基本上就失去了代碼在運行中的控制能力。比如,我們想在某個時刻取消這段代 碼的執行,就得另想一個辦法。隨著.NET4.0到來,這個問題得到了解 決。.NET4.0引入了一種新的設計模式---合作取消模式(Cooperative Cancellation)。

.NET4.0的System.Threading命名空間下新增了兩個成員,一個是 CancellationTokenSource類,一個是CancellationToken結構。 CancellationTokenSource類的主要成員如下:

public sealed class CancellationTokenSource : IDisposable  {
public CancellationTokenSource();
public void Dispose();
public Boolean IsCancellationRequested { get; }
public CancellationToken Token { get; }//CancellationToken結構
public void Cancel();
public void Cancel(Boolean throwOnFirstException);
}

CancellationToken結構代碼大致如下:

 public struct CancellationToken
     { 
         public Boolean IsCancellationRequested { get;  }
         public void ThrowIfCancellationRequested();
         // 當CancellationTokenSource取消時使用的信號量
         public WaitHandle WaitHandle { get; }
         public static CancellationToken None { get; }
         public Boolean CanBeCanceled { get; }
         public CancellationTokenRegistration Register (Action<Object> callback, Object state, Boolean  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 be  cancel.");
         }
     }
}

代碼簡單,我在這裡就不多說了。總之,有了Cooperative Cancellation模式 後,我們對.NET線程池中的代碼的執行有了更大的控制力度,真是個不錯的功能 。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved