.NET4.0线程池的Cooperative Cancellation模式
刚装了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);
}
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);
}
{
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.");
}
}
}
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线程池中的代码的执行有了更大的控制力度,真是个不错的功能。
分类:
.NET Framework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器