Task

一:Task(在.net 4.0版本使用)

  • Task=>Thread+ThreadPool
  • Thread:容易造成时间+空间开销,而且使用不当,容易造成线程过多,导致时间片切换
  • ThreadPool:控制能力比较弱,做Thread的延续,阻塞,取消,超时等等功能。控制权在CLR,而不是在我们手上。

Task是基于ThreadPool的基础上进行的封装,.net4..0之后,微软主推Task做异步启动。

二:Task的启动方式

1.实例化启动

1
2
3
4
5
Task task = new Task(() =>
{
Console.WriteLine("我是工作线程,tid={0}", Thread.CurrentThread.ManagedThreadId);
});
task.Start();

2.工程模式(Task.Factory启动)

var task = Task.Factory.StartNew(() =>
{
    Console.WriteLine("我是工作线程,tid={0}", Thread.CurrentThread.ManagedThreadId);
});

3.使用Task的Run方法

1
2
3
4
var task = Task.Run(() =>
{
Console.WriteLine("我是工作线程,tid={0}", Thread.CurrentThread.ManagedThreadId);
});

4.同步(阻塞线程,同步执行)

1
2
3
4
5
var task = new Task(() =>
{
Console.WriteLine("我是工作线程,tid={0}", Thread.CurrentThread.ManagedThreadId);
});
task.RunSynchronously();

三:Task是建立在ThreadPool

实例化Task在Windgb下的状态:

1572827768283

同步(阻塞线程,同步执行)在Windbg下的状态:

1572827872739

很明显看出:

  • 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);

1572828794968