一:Task(在.net 4.0版本使用)
- Task=>Thread+ThreadPool
- Thread:容易造成时间+空间开销,而且使用不当,容易造成线程过多,导致时间片切换
- ThreadPool:控制能力比较弱,做Thread的延续,阻塞,取消,超时等等功能。控制权在CLR,而不是在我们手上。
Task是基于ThreadPool的基础上进行的封装,.net4..0之后,微软主推Task做异步启动。
二:Task的启动方式
1.实例化启动
1 | Task task = new Task(() => |
2.工程模式(Task.Factory启动)
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("我是工作线程,tid={0}", Thread.CurrentThread.ManagedThreadId);
});
3.使用Task的Run方法
1 | var task = Task.Run(() => |
4.同步(阻塞线程,同步执行)
1 | var task = new Task(() => |
三:Task是建立在ThreadPool
实例化Task在Windgb下的状态:
同步(阻塞线程,同步执行)在Windbg下的状态:
很明显看出:
- Task的底层就是ThreadPool,ThreadPool分配了2个线程,属于CLR所有
- 同步就没有其他线程,当线程执行完,才执行主线程
Task底层都是由不同的TaskScheduler支撑的
TaskScheduler相当于Task的CPU处理器
默认的TaskScheduler是ThreadPoolTaskScheduler
四:Task具有返回值
var task = new Task<string>(() =>
{
return "Hello Word!";
});
task.Start();
Console.WriteLine(task.Result);