1. 编译器到底对await做了什么
2.Task有哪些实现方式
3.clr到底怎么调度Task
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
来计算