(CLR via C#学习笔记)异步操作 - 线程池
一 线程池基础
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计数操作结束,注册的两个委托方法得到执行.
(CLR via C#学习笔记)异步操作 - 线程池的更多相关文章
- JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析
JUC源码学习笔记5--线程池,FutureTask,Executor框架源码解析 源码基于JDK8 参考了美团技术博客 https://tech.meituan.com/2020/04/02/jav ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- c++11 线程池学习笔记 (二) 线程池
学习内容来自以下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...
- .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)
原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析
目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求 ...
随机推荐
- {sharepoint}提升 SharePoint 代码执行权限
提升 SharePoint 代码执行权限 关于如何提升 SharePoint 代码执行权限及相关知识介绍的文章我们园子里有很多, 这里给出其中两篇文章的链接,就不再啰嗦了. http://www.cn ...
- jQuery --- 利用a标签的download属性下载文件!
最近遇到一个项目,需要有点击下载文件的功能. 由于文件格式是多种的,对于 rar / zip / rtf / doc / xlsx / jpg等. 点击下载有的是直接跳转到后进行下载,但有的是打开进行 ...
- c# 自定义控件之小小进度条
先看效果图: 非常简洁的一个进度条. 完整项目源码下载:http://files.cnblogs.com/files/tuzhiyuan/%E8%BF%9B%E5%BA%A6%E6%9D%A1%E6% ...
- stark - 注册表、生成url
一.配置 stark组件开发,仿django自带得admin组件. 1. startapp stark 2. settings: 'stark.apps.StarkConfig' 3. 启动就执行 f ...
- 【云安全与同态加密_调研分析(8)】同态加密技术及其应用分析——By Me
◆同态加密技术(Homomorphic Encryption, HE)及其应用◆ ◆加密方案◆ ◆应用领域◆ ◆厂商◆ ◆同态加密现有产品形态和工程实现◆ ◆参考链接◆ ◆备注(其他参考信息)◆ 同态 ...
- python os模块 os.chmod
os.chmod() 方法用于更改文件或目录的权限. os.chmod(path, mode) 参数 path -- 文件名路径或目录路径. flags -- 可用以下选项按位或操作生成, 目录的读权 ...
- [Axiom 3D]2.Axiom 基本概念
1.Root Root 对象是一个 Ogre 应用程序的主入口点.因为它是整个 Ogre 引擎的外观(Façade )类(请参考设计模式中的外观模式),所以在这里作为第一个被列出来的类,它提供了方便的 ...
- 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树
EasyUI Form 表单 通过 $.fn.form.defaults 重写默认的 defaults. 表单(form)提供多种方法来执行带有表单字段的动作,比如 ajax 提交.加载.清除,等等. ...
- linux安装Navicat,界面出现乱码解决方法
下载Navicat:navicat112_mariadb_cs_x64.tar.gz 点击" ./start_navicat"安装出现界面便面为乱码 解决办法:打开start_na ...
- 5.1 Components — Introduction
1. HTML被设计的时候,浏览器是一个简单的文件浏览器.开发构建大的Web应用程序需要更多的东西. 2. 不是试图取代HTML,然而,Ember.js拥抱它,然后增加了许多新功能使得构建web应用程 ...