剛裝了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線程池中的代碼的執行有了更大的控制力度,真是個不錯的功能 。