Task类是.NetFramework3.0提供的功能,是C#多线程系列的集大成者,提供了丰富的API
线程池是单例的,Task中的线程源于线程池

启动线程

使用task启动新线程有四种方式:

var task1 = new Task(() => Console.WriteLine("dosomething1"));
task1.Start();

var task2 = Task.Run(() => Console.WriteLine("dosomething2"));

var taskFactory1 = new TaskFactory();
taskFactory1.StartNew(() => Console.WriteLine("dosomething3"));

var taskFactory2 = Task.Factory;
taskFactory2.StartNew(() => Console.WriteLine("dosomething4"));

Note:
什么时候使用多线程? 答:任务能并发的时候使用
多线程能干嘛? 答:提升速度,优化用户体验

任务等待

场景:并发执行任务,等待任务结束再进行下一步操作
Task.WaitAll(),参数为所有任务组成的数组,等待所有任务结束才会执行下一步操作,会阻塞主进程
Task.WaitAny(),参数为所有任务组成的数组,只要有一个任务执行完毕就会执行下一步操作,也会阻塞主进程

static void Coding(string name,string projectName)
{
    Console.WriteLine($"Coding Start,{name},{projectName}");
    for (int i = 0; i < 1_000_000_000; i++)
    {
        //
    }
    Console.WriteLine($"Coding End,{name},{projectName}");
}

var taskList = new List<Task>();
taskList.Add(Task.Factory.StartNew(() => Coding("Henry", "DBA")));
taskList.Add(Task.Factory.StartNew(() => Coding("Tom", "Client")));
taskList.Add(Task.Factory.StartNew(() => Coding("Jack", "Server")));
taskList.Add(Task.Factory.StartNew(() => Coding("Jasn", "WeChat")));

Task.WaitAll(taskList.ToArray());//等待所有并发任务完成,阻塞主线程
//Task.WaitAny(taskList.ToArray());//等待只要有一个任务完成就继续向下执行
//Task.WaitAll(taskList.ToArray(), 1000);//等待1000ms

Task 非阻塞式回调

创建TaskFactory的实例,
ContinueWhenAll方法接收两个参数,一个任务数组,一个回调委托,当所有任务执行完毕后,执行委托方法,不会阻塞进程,主进程不受影响
ContinueWhenAny方法接收两个参数,一个任务数组,一个回调委托,当任意一个任务执行完毕后,执行委托方法,不会阻塞进程,主进程不受影响

var taskFactory = new TaskFactory();
var taskList = new List<Task>();
taskList.Add(taskFactory.StartNew(() => Coding("Henry", "DBA")));
taskList.Add(taskFactory.StartNew(() => Coding("Tom", "Client")));
taskList.Add(taskFactory.StartNew(() => Coding("Jack", "Server")));
taskList.Add(taskFactory.StartNew(() => Coding("Jasn", "WeChat")));

taskFactory.ContinueWhenAll(taskList.ToArray(), t => Console.WriteLine("do next things"));
taskFactory.ContinueWhenAny(taskList.ToArray(), t => Console.WriteLine("do next things"));

当前task回调

待续

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐