来源:/kiba/p/.html
C# 5.0引入了新的语法await和async,但我相信人们仍然很少使用它们。 解释await和async的文章有很多,但是你有没有感觉,读完之后,总觉得这个东西很好,但是用的时候却总是想不起来,或者不知道怎么用使用它。
为什么? 我觉得大家对await和async的开启是不正确的。
正确的打开方式
首先让我们看看使用约束。
1.await只能在标记为async的函数中使用。
2.await函数必须标记为async。
你觉得这是一个循环吗? 是的,这是一个循环。 这就是为什么人们不经常使用它们的原因。 这个循环很烦人,那么如何打破它呢?
【很简单,await等待的是线程,不是函数。 】
不明白吗? 没关系,继续读下去。
我们从头来解释一下,先看这组对比
int (){ 1;} 异步任务 (){ 1;}
异步任务等于 int
这意味着当我们正常调用这两个函数时,它们是等价的。 那么使用async Task修改int的目的是什么呢?
目的是让这个方法像这样调用await(),但是像这样直接调用是不会启动线程的,所以这么费力的修改是没有意义的。
当然不是,那么await()什么时候有意义呢?
让我们继续并修改如下。 那么,这时候你再调用await(),你会神奇地发现,它还是没有用。 。 。
该方法正常执行,并且在其中运行的线程执行自己的线程。
async void (){ .(..() + "开始" + .Now); 等待(); .(..() + "End" + .Now);} 异步任务 (){ Task.Run(( ) => { .(..() + " Run1 " + .Now); .Sleep(1000) ; }); 1;}
别担心,我们稍微调整一下,在线程后面添加.().()。 这句话是用来做什么的? 它用于获取线程的返回值。
逻辑是这样的。 如果想要得到线程返回的结果,自然要等待线程结束。
运行它,我们将看到下面的结果。
异步任务 (){ Task.Run(() => { .(..() + " Run1 " + .Now); .Sleep(1000); }).().(); 1;}
不过好像await(); 还是没有效果。 是的,事实是,这确实行不通。 。 。
那么我们怎样才能让它发挥作用呢?
首先,我们定义一个普通函数,其返回值是一个任务。 然后我们拿到Task之后,运行它,然后使用await来等待Task。
所以我们得到这个结果。
async void (){ .(..() + "开始" + .Now); 变量 = (); 。开始(); int i = 等待; .(..() + " i " + i); 。 (..() + "End" + .Now);} Task (){ Task t = new Task(() => { .(..() + " Run1 " + .Now); .Sleep(1000) ; 100; }); t;}
如图所示,写await(); 这样就可以了。
因此,再次强调,await 等待的是线程,而不是函数。
但在图中,我们发现很奇怪的一点,结束的也是线程3,而不是线程1。也就是说,Await会对线程进行优化。
我们来看看两组代码的对比,以便我们更清楚地理解Await。
第一组使用await 等待线程。
async void (){ .(..() + "开始" + .Now); 等待(); .(..() + "结束" + .Now);} 异步任务 (){ .(..( ) + "开始" + .Now); wait Task.Run(() => { .(..() + " Run1 " + .Now); .Sleep(1000); }); wait Task.Run((() ) => { .(..() + " Run2 " + .Now); .Sleep(1000); }); .(..() + "结束" + .现在); ;}
第二组使用等待线程结果来等待线程。
async void (){ .(..() + "开始" + .Now); 等待(); .(..() + "结束" + .现在); } 异步任务 (){ .(..( ) + "开始" + .Now); Task.Run(() => { .(..() + " Run1 " + .Now); .Sleep(1000); }).().(); 任务 .Run(() => { .(..() + " Run2 " + .Now); .Sleep(1000); }).().(); .(..() + " 结束" + . 现在); ;}
可以清楚地看到,在第二组中,线程已经回到了主线程1,而在第一组中,已经优化到了线程4。
结论
Await 是一种非常方便的语法。 它确实让代码变得更简单,但是它主动优化了线程的功能。 如果不理解和使用的话,可能会导致一些奇怪的BUG。
这就是为什么官方只提供了await调用服务的例子,因为在程序内调用时,先了解await再使用它是安全的。
读完这篇文章你有收获吗? 请转发并分享给更多人!!! 欢迎大家点赞、留言讨论。 如果您喜欢这篇文章,可以分享给更多人。 关注我,每天更新分享关于程序员、技术、编程之类的文章! ! ! 我爱你们,让我们一起玩得开心吧! ! !