如何在C#中等待asynchronous工作

我想了解如何在C#中等待asynchronous工作,有一件事情让我困惑不已。 我明白任何使用await关键字的方法都必须用async标记。 我的理解是,当一个关于await关键字的行被击中时,该行下面的代码不会被执行。 asynchronous操作开始在等待线中进行语句,控制返回到可以继续执行的调用方法。

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

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

问题2:在asynchronous调用完成之后或之前何时触发return语句?

问题3:我想使用该服务调用的结果和asynchronous操作不会帮助因为我希望返回结果时命中调用方法。 我知道这可以通过使用调用synchronus的Result属性来完成。 但是,在数据库操作中使用asynchronous的原因是在大多数应用程序中实际占用了80%的时间。

问题4:如何使用数据库操作的asynchronous? 这是可能的和推荐的?

问题5:asynchronous操作在哪些情况下会有用,似乎每个API都只是在没有理由的情况下进行asynchronous操作? 还是我错过了使用asynchronous操作点?

我的意思是说api在没有理由的情况下使用asyn方法,是因为方法必须返回一些东西,直到计算结果如何返回,所以在本质上这个调用将不会被阻塞,直到它没用结果返回?

MSDN 解释了一切 。

我明白,有时候,有时候(特别是来自MSDN的)vanilla文档可能很难适用于您的特定情况,所以让我们回顾一下您的观点。

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

“await”关键字下方的代码只有在asynchronous调用完成后才会执行。 同时,由于你的方法被标记为“asynchronous”,所以控制将被返回给你方法的调用者,直到你的方法完成。 从上面的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; 

我觉得这个意见很有说服力。

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

问题2:在asynchronous调用完成之后或之前何时触发return语句?

后。

问题3:我想使用该服务调用的结果和asynchronous操作不会帮助因为我希望返回结果时命中调用方法。 我知道这可以通过使用调用synchronus的Result属性来完成。 但是,在数据库操作中使用asynchronous的原因是在大多数应用程序中实际占用了80%的时间。

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

此外,返回任务的操作可以用作期货。 参见MSDN期货 ,其中讨论了如何基于期货并行工作并合并结果的几种模式。

如果你的服务只需要一个数据库调用,那么你将其称为asynchronous肯定会更糟。

问题4:如何使用数据库操作的asynchronous? 这是可能的和推荐的?

ADO.NET现在包含asynchronous方法ReadAsync和NextResultAsync 。

这是绝对有可能的,至于推荐这个讨论比我可以写在这里更完整。

问题5:asynchronous操作在哪个场景中有用,似乎每个API都只是在没有理由的情况下进行asynchronous操作? 还是我错过了使用asynchronous操作点?

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

你的大部分问题都在官方 文档和我写的一篇介绍文章中得到解答。

问题4:如何使用数据库操作的asynchronous? 可能吗

entity framework6(目前处于Beta版)支持async 。 较低级别的数据库API以这种或那种方式支持asynchronous操作。 其中一些(如SQLite)直接支持async 。 别人需要你编写简单的async兼容包装。

…并build议?

是的,除非您正在编写与后端不可扩展的单个数据库机器交谈的前端服务器(例如ASP.NET)。 在这个特定的情况下,你的前端规模是没有意义的,因为你的后端无法按比例调整。

问题5:asynchronous操作在哪个场景中有用,似乎每个API都只是在没有理由的情况下进行asynchronous操作? 还是我错过了使用asynchronous操作点?

asynchronous操作的好处是:

  1. 在客户端(UI)方面,您的应用程序保持响应。
  2. 在服务器端,您的应用程序可以更好地扩展。