【发布时间】:2014-01-21 19:27:27
【问题描述】:
在同一行调用带有 await 的异步方法的目的是什么? (不是行为是什么,而是这种模式的实际用途是什么)。据我了解,这实际上是一个同步的“阻塞”调用,因为在此上下文中的执行在 GetDocumentAsync 完成之前不会继续,对吗?
Document someDocument = await db.GetDocumentAsync(documentId);
//AFAIK blocks until GetdocumentAsync completes and returns
CalledAfterAwaitReturnsAndResultIsAvailable(someDocument.SomeProperty);
我见过的大多数展示如何调用异步方法的教程都是这样做的,我在其他人的代码中也看到过。对我来说,它违背了异步执行的目的。似乎从异步调用中受益,您将在没有等待的情况下进行异步调用,并执行一些不依赖于someDocument 的其他不相关的顺序工作(或启动其他一些异步调用),然后执行@987654326 @ 获取异步调用的结果,然后根据该返回执行任何操作。这样您的其他不相关处理就可以在异步调用也在另一个线程中工作时执行。上面的模式我看了这么多,我开始怀疑我是不是误解了什么。
以这种方式进行异步调用的实际应用是什么,它会阻塞直到完成?
【问题讨论】:
-
(这里没有反对意见)Await 方法不是同步阻塞调用。它们立即返回,将方法的其余部分包装在一个 Task 中(这非常简单,但你明白了),然后在等待的调用完成后恢复(在某个线程上,取决于)。
-
MSDN 包含大量解释
async工作原理的文章,可以通过搜索您的帖子标题找到...例如 msdn.microsoft.com/en-us/library/hh191443.aspx。 -
@AaronLS:你可能遇到的困难部分是理解,在某些时候,有人必须得到答案,因此被“阻塞”,直到调用树下的所有等待都完成.但这种想法是不正确的。例如,如果您在事件处理程序中异步调用 Web 方法,并等待该调用完成以更新 UI,那么实际上您有两个方法。一种启动进程(直到等待),立即返回,另一种完成调用(等待之后)并更新 UI。一切都发生在 UI 调度程序上,所以你不会注意到。
-
如果你使用“同步阻塞调用”作为“非阻塞调用”它肯定会混淆读者。 “顺序执行的代码”和“这是阻塞同步调用”之间确实存在很大差异。我的假设是你的“阻塞直到完成”是完全错误的,因此需要 101 篇文章......显然这不是你的问题 - 抱歉。如果有兴趣,您可以查看weblogs.asp.net/dixin/archive/2012/11/02/… 之类的内部详细信息。
-
关于标题...等待异步调用。这可能是一些不正确的术语。检查斯蒂芬图布的"Invoke the method with await"... ugh!。
标签: c# asynchronous async-await