当前位置: 首页 > 知识库问答 >
问题:

Wait async在C中如何工作#[已关闭]

匡安宜
2023-03-14

想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。

我试图理解Wait async在C中是如何工作的,有一件事让我很困惑。我知道任何使用await关键字的方法都必须标记为async。我的理解是,当命中带有await关键字的行时,该行下面的代码不会执行。启动异步操作以在等待行中执行语句,并将控件返回给可以继续执行的调用方法。

问题#1:这个假设是正确的还是wait关键字下面的代码仍在执行?

其次,假设我调用了一个异步服务方法,并需要返回其结果。return语句位于await关键字下面。

问题#2:在异步调用完成之后或之前,何时命中return语句?

问题#3:我想使用该服务调用的结果,异步操作没有帮助,因为我想在返回结果时命中调用方法。我知道这可以使用调用synchronus的Result属性来完成。但是,异步在DB操作中的用途是什么呢?因为在大多数应用程序中,异步操作实际上占用了80%的时间。

问题4:如何将async与DB操作一起使用?是否可能并推荐?

问题#5:异步操作在哪个场景中有用,似乎每个api现在都在无缘无故地进行异步操作?还是我错过了使用异步操作的要点?

我所说的api无缘无故地生成asyn方法的意思是,因为方法必须返回一些东西,直到进行了计算,它们如何才能返回,所以从本质上讲,调用不会仍然阻塞,因为在返回结果之前它将是无用的?

共有2个答案

夏侯兴怀
2023-03-14

你的大多数问题都在官方文件中得到了回答,也在我写的一篇介绍文章中得到了回答。

问题4:如何将async与DB操作一起使用?有可能吗

Entity Framework 6(目前处于测试阶段)支持异步。低级数据库API以某种方式支持异步操作。其中一些(例如SQLite)直接支持异步;其他人需要您编写简单的异步包装器。

... 推荐了吗?

是的,除非您编写的前端服务器(例如ASP.NET)与后端的不可扩展单数据库计算机进行通信。在这种特定情况下,前端的缩放没有意义,因为后端无论如何都无法缩放到与之匹配。

问题#5:异步操作在哪个场景中有用,似乎每个api现在都在无缘无故地进行异步操作?还是我错过了使用异步操作的要点?

异步操作的好处是:

  1. 在客户端(UI),您的应用程序保持响应
赏梓
2023-03-14

MSDN解释了一切。

我理解,虽然有时普通文档(特别是来自MSDN的文档)很难适用于您的特定情况,所以让我们回顾一下您的观点。

问题#1:这个假设是正确的还是wait关键字下面的代码仍在执行?

只有在异步调用完成时,才会执行“await”关键字下面的代码。同时,由于方法标记为“async”,因此在方法完成之前,控制将返回给方法的调用方。从上面的MSDN链接:

Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");

// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();

// The await operator suspends AccessTheWebAsync. 
//  - AccessTheWebAsync can't continue until getStringTask is complete. 
//  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
//  - Control resumes here when getStringTask is complete.  
//  - The await operator then retrieves the string result from getStringTask. 
string urlContents = await getStringTask;

我认为这些评论很能说明问题。

其次,假设我调用了一个异步服务方法,并需要返回其结果。return语句位于await关键字下面。

问题#2:在异步调用完成之后或之前,何时命中return语句?

之后

问题#3:我想使用该服务调用的结果,异步操作没有帮助,因为我想在返回结果时命中调用方法。我知道这可以使用调用synchronus的Result属性来完成。但是,异步在DB操作中的用途是什么呢?因为在大多数应用程序中,异步操作实际上占用了80%的时间。

假设您需要进行三个不相关的数据库查询来完成您的服务,然后根据结果执行计算,然后完成。如果您按顺序执行此操作,则必须等到每个操作完成。如果您使用异步调用,那么C#将并行运行三个查询,您的服务可能会更快完成。

此外,返回任务的操作也可以用作未来操作。请参阅MSDN on Futures,其中讨论了如何基于Futures并行化工作和合并结果的几种模式。

如果您的服务只需要一个DB调用,那么将其称为异步肯定会更糟糕。

问题4:如何将async与DB操作一起使用?是否可能并推荐?

ADO. NET现在包括异步方法ReadAsync和NextResultAsync。

这绝对是可能的,至于推荐的这个讨论比我在这里写的要完整得多。

问题#5:异步操作在哪个场景中有用,似乎每个api现在都在无缘无故地进行异步操作?还是我错过了使用异步操作的要点?

异步操作对于轻松并行任何长时间运行的操作而不会遇到线程问题非常有用。如果您的方法只做一件事,或者一系列简单(快速)的事情,那么是的,异步是没有用的。但是,如果您有多个长时间运行的操作,通过异步并行化它们比管理线程要容易得多,也不容易出错。

 类似资料:
  • 我在C++项目中使用Eclipse。我已经在windows中自动禁用了生成,但当我保存项目时,它仍然生成工作区。我该怎么办?

  • 问题内容: 我从一开始就阅读Java教程,并且对字段或变量上的关键字有疑问。如这里所说: 类变量是使用static修饰符声明的任何字段;这告诉编译器,无论该类被实例化了多少次,该变量确实存在一个副本。可以将定义特定类型自行车的齿轮数的字段标记为静态,因为从概念上讲,相同数量的齿轮将应用于所有情况。 这样,我想如果您有一个对象(在这种情况下,该类是一个实例),并且在其中有一个字段,则与您是否喜欢or

  • 本文向大家介绍“ this”关键字在JavaScript中如何工作?,包括了“ this”关键字在JavaScript中如何工作?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,此关键字用作引用,以引用执行的代码的对象或主题。 示例

  • 在将我的Scala SOAP客户端代码更新为最新的scalaxb(1.2.1)并切换到功能(而不是Eithers)之后,我得到了一个: 我是否遗漏了任何Netty/调度配置步骤? 以下是stacktrace: 提前感谢您的任何提示。

  • 此代码不起作用。我不知道我需要添加什么资源。下面是Datepicker的链接:http://jsfiddle.net/rMhVz/1030/ 我的代码在下面。我真的需要让它发挥作用。谢谢你的帮助。提前谢谢。

  • 我使用Java8和SpringAPI组成邮件正文,如下所示。 预期结果: 尊敬的用户:, 样本邮件。 您诚挚的, ABC。Com 0094778999658 实际结果: 尊敬的用户:, 样本邮件。 你忠实的,ABC。Com 0094778999658 我不知道为什么最后3行出现在同一行,即使我使用了System.line分隔符()。 我已经尝试了,但没有成功。 有人能告诉我出了什么事吗? 我知道还