浅谈Task多线程剖析await关键字
引言
其实谈到多线程吧,首先应该联想到的是异步;那么异步究竟是什么呢?异步其实就好像你在家里做饭一样:同样的时间,你可以在用电饭锅煮饭的时候,这个煮饭的过程电饭锅煮它的,你只需要知道它在煮着的就是,但是不影响你又在进行洗或是炒菜的这个过程,仅此而已!比喻不太恰当,但意义就是这样,说的高大上点,就是利用CPU的时间片,通过线程来挂起任务,不必等到极大耗时的那个程序步骤或者方法执行完,才给你反馈结果,而是确保编译通过的情况下,让执行的过程挂起到后台的进程去慢慢执行,而你立马就能得到一个执行成功的结果,实质上是这个任务在计算机后台进程中一个一个的执行,却不影响你做接下来的操作,真的很nice!
一、异步线程
以这段代码为例,Task开启两个线程用于执行任务,其实也就是所谓的多线程,想开多少个就多少个,在整个处理的过程中,只要不产异常的情况,主线程立即就执行完了,而不必等待两个线程完才来执行主线程,这就是异步的效用;就好像你发出一个Http请求,同时批量倒入成千上万的数据,它会立即就告诉你导入的结果,而不是将这成千上万的数据导完后才告诉你结果;其实也就是,电饭锅你煮你的饭,电磁炉你熬你汤,一点也也不影响我在这个过程中睡了一觉后,再来看会剧!
static void Main(string[] args)
{
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("task1-" + i);
}
});
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("task2-" + i);
}
});
Console.WriteLine("===========主线程==========");
Console.ReadKey();
}
二、await的妙用
通过这段代码,我们可以看出,awit关键字的作用就是等待上一个线程的执行结果返回以后,我才接受新的线程执行 新的任务!这种情况比较适用于,很依赖上一个await 执行的结果,才能支撑起下一个进程任务的执行的情况!
static async Task Main(string[] args)
{
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("task1-" + i);
}
});
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("task2-" + i);
}
});
Console.WriteLine("===========主线程==========");
Console.ReadKey();
}