C#多线程之 Task
Task类是.NetFramework3.0提供的功能,是C#多线程系列的集大成者,提供了丰富的API线程池是单例的,Task中的线程源于线程池启动线程使用task启动新线程有四种方式:var task1 = new Task(() => Console.WriteLine("dosomething1"));task1.Start();var task2 = Task.Run(() =>
·
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回调
待续
更多推荐
已为社区贡献1条内容
所有评论(0)