MSDN解释了一切。
我知道有时香草文档(特别是来自 MSDN)可能难以适用于您的特定情况,所以让我们回顾一下您的观点。
问题#1:这个假设是正确的还是等待关键字下面的代码仍然被执行?
“await”关键字下面的代码只会在异步调用完成时执行。同时,由于您的方法被标记为“异步”,因此控制权将返回给您的方法的调用者,直到您的方法完成。从上面的 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;
我认为评论非常具有解释性。
其次假设我调用了一个服务方法 async 并且需要返回它的结果。return 语句位于 await 关键字下方。
问题 #2:return 语句何时命中,在异步调用完成之后还是之前?
后。
问题#3:我想使用该服务调用的结果,异步操作无济于事,因为我希望在返回结果时调用调用方法。我知道这可以使用使调用同步的 Result 属性来完成。但是,在数据库操作中使用异步是什么,因为它们实际上在大多数应用程序中占用了 80% 的时间。
假设您需要进行三个不相关的数据库查询来完成您的服务,然后根据结果进行计算,然后完成。如果您按顺序执行此操作,则必须等到每个操作完成。如果您使用异步调用,则 C# 将并行运行三个查询,您的服务可能会更快完成。
此外,返回 Task 的操作可以用作 Futures。请参阅有关 Futures 的 MSDN,其中讨论了有关如何基于 futures 并行化工作并合并结果的几种模式。
如果您的服务只需要一个数据库调用,那么将其称为异步肯定会更糟。
问题 # 4:如何将异步与数据库操作一起使用?有可能并推荐吗?
ADO.NET 现在包括异步方法ReadAsync 和 NextResultAsync。
这绝对是可能的,因为推荐这个讨论比我在这里写的要完整得多。
问题#5:异步操作在哪种情况下有用,似乎每个api现在都在无缘无故地进行异步操作?还是我错过了使用异步操作的重点?
异步操作对于轻松并行化任何长时间运行的操作而不会遇到线程问题非常有用。如果您的方法只做一件事,或者一系列简单(快速)的事情,那么是的,异步是没有用的。但是,如果您有多个长时间运行的操作,则通过异步将它们并行化比管理线程要容易得多且不易出错。