.net 线程基础 ThreadPool 线程池
2024-08-29 00:15:21
1. ThreadPool 线程池异步:
//public static bool QueueUserWorkItem(WaitCallback callBack);
//public static bool QueueUserWorkItem(WaitCallback callBack, object state);
QueueUserWorkItem 中的WaitCallback 参数是 一个 委托对象。
static void Main(string[] args) {
//线程
AsynchTempte.ThreadQueueMethod();
} /// <summary>
/// 执行简单的计算限制操作 线程队列
/// </summary>
public static void ThreadQueueMethod()
{
//要将一个异步的计算限制操作放到线程池队列中,通常可以调用ThreadPool类定义 //线程池以异步执行方法
Console.WriteLine("Main thread:queuing an asynchronous operation");
ThreadPool.QueueUserWorkItem((state) => {
//执行委托代码
Thread.Sleep();
Console.WriteLine("In ComputeBoundOp:State={0}", state);
}, ); Console.WriteLine("Hit Liuyl");
}
2. 执行上下文: CallContext
当一个线程使用另一个线程时候,前者执行的上下文会流向后者。
执行如下代码 会发现Name 就没有内容输出 ExecutionContext.SuppressFlow()
/// <summary>
/// 执行上下文
/// </summary>
public static void ThreadQueueMethod2()
{
//将一些数据放到当前线程的逻辑上下文中
CallContext.LogicalSetData("Name", "Liuyl"); // 初始化要由一个线程池做的一些工作
//线程池才能访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine("Name={0}", CallContext.LogicalGetData("Name"));
}); //阻止上下文流动
ExecutionContext.SuppressFlow(); // 初始化要由一个线程池做的一些工作
//线程池才能访问逻辑调用上下文数据
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine("Name2={0}", CallContext.LogicalGetData("Name"));
}); //恢复线程的执行上下文的流动
ExecutionContext.RestoreFlow(); Console.WriteLine("liuylstart");
}
3. 协作取消和超时:
.net 提供了标准的取消操作模式 - 协作式 CancellationTokenSource
如下 代码 ,调用cts.Cancel 后 遍历就停止
/// <summary>
/// 协作取消和超时
/// </summary>
public static void ThreadQueueMethod3()
{
CancellationTokenSource cts = new CancellationTokenSource();
//将CancellationToken 和“要数到的票数” 传入函数count
ThreadPool.QueueUserWorkItem(o => Count(cts.Token, ));
Console.WriteLine("Press <enter> to cancel the operation.");
Console.ReadLine();
//停止
cts.Cancel(); Console.ReadLine();
} private static void Count(CancellationToken token, int countTo)
{
for (int count = ; count < countTo; count++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Count is cancellen");
break;
}
Console.WriteLine("count:{0}", count);
Thread.Sleep();
}
Console.WriteLine("Count is done"); }
CancellationTokenSource 的 Token.Register 回调委托:
//当执行 cts.Cancel(); 会输出如下文本
cts.Token.Register(() => Console.WriteLine("Canceled 1"));
cts.Token.Register(() => Console.WriteLine("Canceled 2"));
最新文章
- 终于解决各种动画问题了,感谢雨松MOMO
- CSS3——让最后一行显示省略号
- windows下C语言编程获取磁盘(分区)使用情况
- x-forwarded-for的深度挖掘
- malloc心得
- 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程
- 快递鸟物流单号自动识别接口JAVA对接demo
- TCP/IP入门学习(1)---分层概述
- SQL Server 字段状态判断语句
- Linux中的文件压缩,打包和备份命令
- [工作问题总结]MyEclipse 打开项目
- Java日志管理
- 数据完整性(Data Integrity)笔记
- Delphi F11 全屏
- [Codeforces 864A]Fair Game
- LoadRunner(二)——性能测试过程概述
- Vue系列之 =>; html-webpack-plugin的两个基本作用
- RIPng配置(第十三组)
- js 移动端 多图上传 预览 删除 base64转为url 传给后端
- Python自学:第二章 数字 整数