MSDN 解释了一切。
我知道有时候普通的文档(特别是来自MSDN的)可能很难应用到你的特定情况中,所以让我们来看看你的问题。
问题#1:这个假设是正确的还是在“await”关键字下面的代码仍然被执行?
“await”关键字下面的代码只有在异步调用完成后才会被执行。同时,由于你的方法被标记为“async”,控制权将被返回给调用你的方法的调用者,直到你的方法完成。
来自上面的MSDN链接:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
我认为这些注释已经很详细了。
其次,假设我调用了一个异步服务方法并需要返回结果。返回语句位于 await 关键字下面。
问题 #2:当异步调用完成后,返回语句何时执行,是在之后还是之前?
之后执行。
问题 #3:我想使用该服务调用的结果,但异步操作无效,因为我希望在返回结果后调用方法。我知道可以使用 Result 属性来实现同步调用。但是,那么 DB 操作中的异步调用有什么用处呢?毕竟它们是大多数应用程序中实际上占用了 80% 的时间。
假设您需要进行三个不相关的 DB 查询才能完成服务,然后根据结果执行计算,最后完成。如果按顺序执行,则必须等待每个操作完成。如果使用异步调用,则 C# 将并行运行三个查询,您的服务可能会更快地完成。
此外,返回 Task 的操作可以用作 Futures。请参见 MSDN 上的 Futures,其中讨论了几种基于 Futures 并行化工作并合并结果的模式。
如果您的服务只需要一个 DB 调用,则异步调用肯定会更糟。
问题 #4:如何在 DB 操作中使用异步?是否可行且推荐?
现在 ADO.NET 包括异步方法 ReadAsync 和 NextResultAsync。
这是可行的,至于推荐方面,这篇讨论比我能写的更完整 here。
问题 #5:在哪种情况下,异步操作是有用的?似乎现在每个 api 都在做异步操作,但没有明显的原因?或者我错过了使用异步操作的重点?
异步操作非常有用,可以轻松地并行化任何长时间运行的操作,而不会遇到线程问题。如果您的方法只做一件事,或一系列简单(快速)的事情,那么是无用的去异步化它们。但是,如果您有多个长时间运行的操作,则通过异步进行并行处理比管理线程要容易得多,也减少了出错的可能性。