异步编程C#

Task与Thread的区别

Thread每次运行会创建一个新的线程,线程的创建、结束带来大量的开销。
Task每次运行时,会去线程池中寻找空闲的线程,将其分配使用。

Task及awit/async

async/await 结构可分成三部分:
(1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行;
(2)异步方法:该方法异步执行工作,然后立刻返回到调用方法;
(3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。

如何看异步代码?

async定义的函数可分为以下几部分: await之前的部分;await部分;await之后的部分。
当主函数运行到async函数时,先运行await之前的部分,遇到await后,线程分为两部分,(此时主线程从async函数中已经返回了)一个线程在主函数中继续运行,另一线程在继续运行await函数。PS:async函数内部的执行顺序,还是不变的,严格从上往下执行,即使有多个awit关键词,仍旧执行完前一个await语句后,再执行后一个await语句。

示例代码与输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Program
{
static void Main(string[] args)
{
Console.WriteLine("main thread start!");
Task t = TestAsync();
Console.WriteLine("main thread end!");
Console.Read();

}

private static async Task TestAsync()
{
Console.WriteLine("Task start!");
await Task.Run(() =>
{
Console.WriteLine("await0 start!");
for (int i = 0; i < 500000; i++)
;
Console.WriteLine("await0 end!");
});
await Task.Run(()=>
{
Console.WriteLine("awit1 start!");
for (int i = 0; i < 5; i++)
;
Console.WriteLine("awit1 end!");
}
);
}
}

运行结果如下所示:

1
2
3
4
5
6
7
main thread start!
Task start!
await0 start!
main thread end!
await0 end!
awit1 start!
awit1 end!

-------------本文结束感谢您的阅读-------------