要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点。如果你已经对Task很了解,那么如何使用async和await,在此主要总结了以下三点:
1> 只有在async方法里面才能使用await操作符;
2> await操作符是针对Task对象的;
3> 当方法A调用方法B,方法B方法体内又通过await调用方法C时,如果方法C内部有异步操作,则方法B会等待异步操作执行完,才往下执行;但方法A可以继续往下执行,不用再等待B方法执行完。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main方法开始");
//在Main方法中调用B方法,而B方法中又通过await调用方法C时,如果方法C内部有异步操作,则方法B会等待异步操作执行完,才往下执行;但方法Main可以继续往下执行,不用再等待B方法执行完
B(); //不用等B方法执行完毕,就会往下执行。(因为:await的阻塞方式并不是阻塞同步代码所在的主线程,await其实是阻塞的当前异步函数的异步线程。)
Console.WriteLine("Main方法结束");
}
public static async void B()
{
Console.WriteLine("B方法开始");
await C(); //这里会等待C方法执行完毕,才会往下执行。 await的意思是等待 C这个异步方法执行完毕。
Console.WriteLine("B方法结束");
}
public static Task C()
{
Console.WriteLine("C方法开始");
return Task.Run(() => Console.WriteLine("C方法执行结束")); //这个Run方法的返回值是Task类型
}
}
总结:
await的阻塞方式并不是阻塞同步代码所在的主线程,await其实是阻塞的当前异步函数的异步线程。
虽然await会阻塞async异步函数,但是并没有阻塞同步代码的主线程,同步和异步之间仍然相互不阻塞。
虽然await阻塞异步函数向后执行,看起来像是同步的,但是它本质还是异步的,我们同样可以并行执行其他的不关联的异步操作,而同步函数不能并行执行。