(CLR via C#学习笔记)异步操作 - 线程池
2024-09-20 23:21:10
一 线程池基础
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计数操作结束,注册的两个委托方法得到执行.
最新文章
- Linux系统的理解及学习Linux内核的心得
- iOS开发系列--C语言之预处理
- UE4 Windows平台部署游戏到IOS 第二部分
- magento的robots文件编写和判断是否是一个导航分类页面
- js获取上一页、当前页及域名url方法,JS反回上一页的方法
- ES5 vs ES6
- c#执行并行任务之Parallel与TaskFactory
- HDU- 2265 Encoding The Diary
- HDU 5012 Dice DFS
- Python在信号与系统(1)——Hilbert兑换,Hilbert在国家统计局的包络检测应用,FIR_LPF滤波器设计,格鲁吉亚也迫使高FM(PM)调制
- PAT basic level 1001-1019 解题笔记
- 关于GPL329A中获取摄像头sensor id的问题
- js的观察者模式
- CancellationTokenSource 和 CancellationToken 取消线程
- JMeter中BeanShell的实际应用
- 记github上搭建独立域名的免费博客的方法过程
- L1-052 2018我们要赢
- I/O排查命令
- thinkphp5 消息队列thinkphp-queue扩展
- Oracle的pipelined函数实现高性能大数据处理
热门文章
- Android中Log机制详解
- Hive JOIN使用详解
- 从零打造在线网盘系统之Hibernate查询与更新技术
- 170808、生成为CVS文件
- CF593C Beautiful Function 构造
- 微软威胁情报中心总经理的十句话——From John Lambert——太精辟了.......
- MFC截图和界面刷新相关问题
- &#39;ascii&#39; codec can&#39;t decode byte 0xc4 in position 27: ordinal not in range(128)
- IQKeyboardManager第三方库的使用
- win7 +v Ubuntu 16.04 grub rescue 模式下修复 grub