一 线程池基础

1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取
操作项,派发给线程池中的线程;

2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池时,如果线程池中没有线程或者没有
空闲状态的线程,将会创建一个新的线程执行派发的操作,如果有空闲状态的线程,将直接派发一个
空闲状态的线程执行操作;

3.线程池线程完成操作任务后,线程不会被销毁,而是返回线程池,进入空闲状态,等待响应另一个派发请求;
4.当一个线程池线程处于空闲状态一段时间后(不同的CLR对这个时间定义不同),线程会自己醒来终止自己以释放内存资源.

示例代码:

 Console.WriteLine("主线程...");
ThreadPool.QueueUserWorkItem(DoSomething, );
Console.WriteLine("主线程继续执行..."); static void DoSomething(object state)
{
Thread.Sleep();
int num = (int)state;
Console.WriteLine("DoSomething..., Number:" + num);
return;
}

输出结果:

主线程...

主线程继续执行...

DoSomething..., Number:5

二 执行上下文

System.Threading命名空间有一个ExecutionContext类,它允许你控制线程的执行上下文如何

从一个线程"流"向另一个,默认情况下,CLR自动造成初始线程的志向上下文"流向"任何辅助线程.

示例代码:

 CallContext.LogicalSetData("Name", "Mike");
//线程池线程可以访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Name:{0}", CallContext.LogicalGetData("Name"))); //取消执行上下文在异步线程间的流动
ExecutionContext.SuppressFlow();
//线程池线程将不能访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Name:{0}", CallContext.LogicalGetData("Name"))); //恢复执行上下文在异步线程间的流动
ExecutionContext.RestoreFlow();
//...

执行结果:

Name:Mike

Name:

三 协作式取消

 //注册取消CancelationToken时调用的委托
var cts = new CancellationTokenSource();
cts.Token.Register(() => Console.WriteLine("The operation will be cancelled. -- 1"));
cts.Token.Register(() => Console.WriteLine("The operation will be cancelled. -- 2")); //线程开始执行操作
ThreadPool.QueueUserWorkItem(a => Count(cts.Token, )); Console.WriteLine("Please <Enter> to cancel the operation.");
Console.ReadLine(); //传达取消请求
cts.Cancel(); //执行计数操作
static void Count(CancellationToken token, int countTo)
{
for (int i = ; i < countTo; i++)
{
if (token.IsCancellationRequested) //是否已请求取消
{
break;
}
Thread.Sleep();
Console.WriteLine(i);
}
}

说明: 键入"Enter"键,传达取消标识,Count计数操作结束,注册的两个委托方法得到执行.

最新文章

  1. Linux系统的理解及学习Linux内核的心得
  2. iOS开发系列--C语言之预处理
  3. UE4 Windows平台部署游戏到IOS 第二部分
  4. magento的robots文件编写和判断是否是一个导航分类页面
  5. js获取上一页、当前页及域名url方法,JS反回上一页的方法
  6. ES5 vs ES6
  7. c#执行并行任务之Parallel与TaskFactory
  8. HDU- 2265 Encoding The Diary
  9. HDU 5012 Dice DFS
  10. Python在信号与系统(1)——Hilbert兑换,Hilbert在国家统计局的包络检测应用,FIR_LPF滤波器设计,格鲁吉亚也迫使高FM(PM)调制
  11. PAT basic level 1001-1019 解题笔记
  12. 关于GPL329A中获取摄像头sensor id的问题
  13. js的观察者模式
  14. CancellationTokenSource 和 CancellationToken 取消线程
  15. JMeter中BeanShell的实际应用
  16. 记github上搭建独立域名的免费博客的方法过程
  17. L1-052 2018我们要赢
  18. I/O排查命令
  19. thinkphp5 消息队列thinkphp-queue扩展
  20. Oracle的pipelined函数实现高性能大数据处理

热门文章

  1. Android中Log机制详解
  2. Hive JOIN使用详解
  3. 从零打造在线网盘系统之Hibernate查询与更新技术
  4. 170808、生成为CVS文件
  5. CF593C Beautiful Function 构造
  6. 微软威胁情报中心总经理的十句话——From John Lambert——太精辟了.......
  7. MFC截图和界面刷新相关问题
  8. &#39;ascii&#39; codec can&#39;t decode byte 0xc4 in position 27: ordinal not in range(128)
  9. IQKeyboardManager第三方库的使用
  10. win7 +v Ubuntu 16.04 grub rescue 模式下修复 grub