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多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
随机推荐
- linux source命令的用法
source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.(如把ls写入a.txt,然后source a.txt 就会执行ls命令,列出目录)注 ...
- javaWeb的验证码编写
一.前言 验证码可以说在我们生活中已经非常普遍了,任何一个网站,任何一个App都会有这个功能,但是为啥要有这个呢?如何做才能做出来呢?下面小编会带领大家一起用java完成一个验证码的功能. 二.验证码 ...
- hibernate映射组成关系
目录结构 类 package com.hibernate.helloworld; public class School { private String name; private String a ...
- Spring MVC 指导文档解读(二)
Special Bean Types In the WebApplicationContext 解读 1.WebApplicationContext 特有的几种 Bean Types 2. 也表明 与 ...
- RuntimeException
Throwable Error ... Exception !RuntimeException RuntimeException 两类:checked exceptions 和 unchecked e ...
- 笔记:使用mailto在网页中链接Email地址
<a>标签还有一个作用是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件.我们还可以利用mailto做许多其它事情.下面一一进行讲解,请看详细图示: 注意:如 ...
- (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
转自:http://blog.csdn.net/lingxyd_0/article/details/8695747 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET B ...
- Alpha阶段敏捷冲刺(八)
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:写了关于统计的按钮的代码. 徐璐琳:完善了&q ...
- sudo执行脚本找不到环境变量和命令
简介 变量 普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能获取到值,如题情况如下: ...
- hdu 5072 两两(不)互质个数逆向+容斥
http://acm.hdu.edu.cn/showproblem.php?pid=5072 求n个不同的数(<=1e5)中有多少组三元组(a, b, c)两两不互质或者两两互质. 逆向求解,把 ...