个人对C#中async和await的理解
本人以前没有接触过c#编程,最近由于毕设需要用到Unity编程,所以开始了解一些,c#中的async和await关键字是以前没有接触过的,所以查了一些资料,如果想详细了解用法可以看其他大佬们的博客,他们的博客已经写的非常详细了,但是身为一个初学者,我对很多关键字都没有太多了解,在看大佬们的详解时,他们又会扯出来task、event、Lamdba表达式,delegate 等等,导致我不得不去搜其他关键字的用法,总之看了一大圈下来感觉还是云里雾里的。
本文仅为我所看的一些关键字用法的个人总结或者是我在学习过程中觉得疑惑的点,如果想要系统的了解或其他我没有提到的点,可以去看其他大佬的博客
以及如果哪里有错误,欢迎指出~
async
async的出现是为了解决异步执行问题,函数加了async关键字就表明该函数是异步的
注:这里的异步是指该函数本身可以与其他语句异步执行,但是该函数内部执行仍然是同步的
void Method1()
{
Console.WriteLine("Method1 Start");
}
void Method2()
{
Console.WriteLine("Method2 Start");
}
void Method2()
{
Console.WriteLine("Method3 Start");
}
void Method2()
{
Console.WriteLine("Method4 Start");
}
async void funcA()
{
Method1();
Method2();
}
void funcB()
{
Method3();
Method4();
}
static void Main()
{
funcA();
funcB();
}
main函数中执行funcA()和funcB(),由于funcA函数前面加了async关键字,表示该函数是异步执行的,funcA()和funcB()可以异步执行,即在funcA()没有执行完时就可以开始执行funcB();但是在funcA()内部仍然是同步执行的,即Method1()执行完之后才可以开始执行Method2()
await
await关键字表示必须等待该函数执行完之后才可以继续往下执行,将上面的main函数更改为
static void Main()
{
await funcA();
funcB();
}
其他函数不变,忘记的同学可以往上回翻
funcA加了await关键字之后则必须等待funcA()执行完毕之后才可以往下执行funcB()函数
这里可能会有一个疑惑,既然加了之后又变为同步执行了,那为什么不直接把async和await都去掉?
加了async之后表示这个方法是多线程的,而如果把async和await都去掉,那么在执行funcA()时就会把主线程阻塞掉,而在现实中我们往往并不希望这样,比如在点一个按钮之后就不能和界面交互了,这会让人疯掉!而加了async和await之后就可以解决主线程被阻塞的问题