等待与异步调用在同一行的实际用法?

Aar*_*nLS 7 c# asynchronous async-await

在同一行上使用await调用异步方法的目的是什么?(不是什么行为,但这种模式的实际用途是什么).据我所知,这实际上是一个同步"阻塞"调用,因为在此上下文中的执行在GetDocumentAsync完成之前不会继续,对吗?

Document someDocument = await db.GetDocumentAsync(documentId);
//AFAIK blocks until GetdocumentAsync completes and returns 
CalledAfterAwaitReturnsAndResultIsAvailable(someDocument.SomeProperty);
Run Code Online (Sandbox Code Playgroud)

大多数教程展示了如何调用我见过的异步方法,并且我已经在其他代码中看到了它.对我而言,它违背了异步执行的目的.看起来好像从异步调用中受益,你可以在没有await的情况下进行异步调用,并做一些其他不相关的顺序工作(或启动一些其他异步调用)而不依赖于someDocument,然后执行await以获取结果异步调用,然后做任何依赖于该返回的事情.这样,当异步调用也在另一个线程中工作时,可以执行其他不相关的处理.我已经看到了上述模式,我开始怀疑我是否误解了一些东西.

以这种方式进行异步调用的实际应用是什么,这样它会阻塞直到它完成?

Ben*_*igt 8

它调用的await关键字不会调用Wait该任务ContinueWith.结果是,您获得完成回调,而不是阻塞调用.


Sco*_*ain 6

我认为你缺少的关键是当你点击第一个时await,你在里面的函数返回一个Task<Document>(假设你的函数被声明为public async Task<Document> Foo())并让调用你的函数的人继续做其他的工作.

然后调用者可以处理其他一些工作并稍后检查任务以查看它是否已完成,或者他可以await立即自己并继续延期工作直到你找到有工作要做的人(在Forms或WPF上)一直到消息泵,让UI在您等待任务完成时继续响应).

  • 正确的,如果你正在进行异步,你可能也想让调用方法异步(并且该函数的调用方法,以及该函数的函数调用方法)"一直向下"以获得任何真正的好处.通常,如果你不能"一直向下",只需坚持非异步版本的调用就可以获得更好的性能(这在ASP.NET使用async时通常是这样) (2认同)