Task异步编程,刨根到底
1. 编译器到底对await做了什么
await 一个异步操作的时候,实际上编译器会创建一个状态机,这个状态机包含了调用者的上下文变量,状态机使用
yield迭代器实现,状态机由clr调度,每次运行都会重新加入回队列,直到Task完成或异常结束
2.Task有哪些实现方式
经常我们可以看到一些库中使用
TaskCompletionSource来创建Task,改变Task的状态,实际上TaskCompletionSource只是在Task基础上做简单的封装操作
TaskCompletionSource会直接创建一个Task,设置Result也是直接在Task上设置结果,不同手动操作的地方就是做了自旋等待Task.IsCompleted再返回,保证线程安全性
所以Task的实现就是将Task的状态切换补完的一个过程,让其成为一个Actor模型,实现方式可以自由发挥
3.clr到底怎么调度Task
所有的Task都是由
TaskScheduler调度,最终进入到ThreadPool队列中,然后clr获取队列中的工作项并运行
Task.Wait()操作会先将Task移出TaskScheduler然后再使用当前线程执行
TaskScheduler 有两种Scheduler实现,默认是ThreadPoolTaskScheduler
Task.Run将会在内部 new Task 创建一个任务,并将Task添加到默认的TaskScheduler.Default中
TaskScheduler默认是使用ThreadPoolTaskScheduler实现
Task.Run调用TaskScheduler.QueueTask方法将Task添加到任务队列中,在ThreadPoolTashScheduler中并没有保存任务队列,而是直接调用
ThreadPool中的UnsafeQueueCustomWorkItem方法添加到ThreadPool中,由ThreadPool管理任务队列
ThreadPool中有一个全局的工作队列,所有异步任务都将会加入到队列中,并由clr去获取队列中的IThreadPoolWorkItem运行
ThreadPool根据工作队列的数量,首先会先创建CPU核心数数量的工作线程,并以每秒一个的速度创建新线程
在ThreadPool中,规定了任务的时间片,每个时间片为30个时钟,每个线程运行满一个时间片才会返回线程池
CPU时钟使用Environment.TickCount来计算
Task异步编程,刨根到底的更多相关文章
- Task异步编程
		
Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...
 - c#中的Task异步编程
		
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步 ...
 - Task 异步编程测试案例及基础应用说明
		
对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为tas ...
 - 新手浅谈C#Task异步编程
		
Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async.await,这儿我们先说Task相关. 在实际编程中,我们用的较多的是Task.Task.Fa ...
 - 新手浅谈Task异步编程和Thread多线程编程
		
初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有dele ...
 - .NET 4.5 Task异步编程学习资料
		
参考资料: 1. http://www.cnblogs.com/heyuquan/archive/2013/04/18/3028044.html
 - 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
		
异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...
 - Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
		
Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...
 - 利用反射快速给Model实体赋值  使用 Task 简化异步编程  Guid ToString 格式知多少?(GUID 格式)  Parallel Programming-实现并行操作的流水线(生产者、消费者)  c# 无损高质量压缩图片代码  8种主要排序算法的C#实现 (一)  8种主要排序算法的C#实现 (二)
		
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
 
随机推荐
- Win7 VS2013环境编译Squirrel 3.0.7
			
Squirrel是一个类似Lua,但是更面向对象的脚本语言. 国内这个介绍很少,环境配置更是没有任何文章提到,花了点时间搞定了,备忘记录下过程. 首先是下载,写本文时Squirrel最新版本为3.0. ...
 - 在运行bat文件时,报错发生系统错误123,文件名,目录名或卷标语法不正确
			
报错:发生系统错误123,文件名,目录名或卷标语法不正确 这个错误就相当于你在dos命令行中输入一个命令,报错“不是内部或外部命令,也不是可运行的程序”.此时你可以在系统环境变量中检查是否配置了这个命 ...
 - java Concurrent包学习笔记(三):ReentrantLock
			
一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁 ...
 - mybatis xml中的大于、小于等符号写法
			
xml特殊符号转义写法 < < > > <> <> & & ' ...
 - vue中的前置守卫
			
前置守卫是为了验证用户信息真实性,一些内容只能在用户登陆以后才能进行查看,例如个人中心,我的购物车,等个人页面,非隐私页面 用router.beforeEach进行验证,这个方法必须写在router实 ...
 - day2(基础数据类型)
			
一.基础数据类型操作 1.数字 int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: int.bit_length() -> int Number of bits necess ...
 - js基础学习笔记(二)
			
2.1 输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...
 - hadoop的两大核心之一:HDFS总结
			
什么是HDFS? hadoop distributed file system(hadoop分布式文件系统) 是一种允许文件通过网络在多台主机上分享的文件系统, 可让多机器上的多用户分享文件和存储空间 ...
 - Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
			
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
 - ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
			
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...