Csharp语法:await和async的正确打开方式

 2024-02-16 01:02:24  阅读 0

来源:/kiba/p/.html

c#对com组件的调用返回了错误_组件调用出错_对com组件的调用返回了

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再使用它是安全的。

读完这篇文章你有收获吗? 请转发并分享给更多人!!! 欢迎大家点赞、留言讨论。 如果您喜欢这篇文章,可以分享给更多人。 关注我,每天更新分享关于程序员、技术、编程之类的文章! ! ! 我爱你们,让我们一起玩得开心吧! ! !

标签: 线程 调用 语法

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码