【问题标题】:C# await / async in WebApi, what's the point?WebApi中的C#等待/异步,有什么意义?
【发布时间】:2014-09-08 01:37:21
【问题描述】:

有人知道这样做的目的是什么吗?

 private async Task<bool> StoreAsync(TriviaAnswer answer) { ... }

 [ResponseType(typeof(TriviaAnswer))]
 public async Task<IHttpActionResult> Post(TriviaAnswer answer)
 {
     var isCorrect = await StoreAsync(answer);
     return Ok<bool>(isCorrect);
 }

通过检查,它告诉它异步运行私有方法,但同步等待它结束。我的问题是,这有什么意义吗?或者这只是一种花哨但徒劳的技术?我在研究 Web API / MVC / SPA 的一些代码时遇到了这个问题。

无论如何,任何见解都会很有用。

【问题讨论】:

  • 1) 请显示MyMethod() 的返回类型,这很重要。 2)你提到的同步等待在哪里,你的示例代码没有。
  • 我相信同步等待发生在await。我会尽快更新代码。
  • await 的定义是异步等待。同步等待将是 var isCorrect = StoreAsync(answer).Result;
  • 这篇文章对await 有一些有趣的误解,希望在链接的副本中涵盖。如果没有 - 请提供更具体的细节,我很乐意投票重新开放。
  • @AlexeiLevenkov:你应该在关闭之前完成这项工作。

标签: c# asp.net-mvc asp.net-web-api single-page-application


【解决方案1】:

尽管有它的名字,await 实际上并不像 Thread.Join 那样工作。 asyncawait 是 Microsoft 对 coroutines 的实现,使用延续传递样式实现。工作已重新排序,以便在完成Task&lt;T&gt; 时可以继续处理。编译器重新排列指令以最大限度地利用异步操作。

This article 如此解释:

await 表达式不会阻塞它正在执行的线程。相反,它会导致编译器注册 async 方法的其余部分作为等待任务的延续。然后控制权返回给异步方法的调用者。当任务完成时,它调用它的继续,并且异步方法的执行从它停止的地方继续。

对于一些琐碎的代码示例,await 并没有多大意义,因为在等待的同时没有其他工作可以做。

【讨论】:

  • 您在等待期间没有其他工作可以做。您能解释一下吗?如果对Post 进行了多次调用,则线程可以开始为请求提供服务,而无需等待任务完成。
  • 罗伯特,我已经收集到,通过使用 async/await,您可以释放线程,以便它们可以去处理其他请求,直到任务完成。这将通过使您的应用程序更高效来提高整体性能(即每个线程都不是更高效;用户不会注意到这一点,而是您在服务器上使其更容易)。这有什么道理吗?还是我错过了重点?
  • @RowanFreeman:我想说的是,通过重新排序线程正在执行的指令,您可以提高它们的工作效率,因此您需要更少的线程来完成相同的工作。线程停止的频率降低了,因为它们不再等待阻塞调用完成。
  • @Shoe:由于您返回了一个任务(即,一个将在未来某个时间返回结果的承诺),并且它在处理多个请求的服务器上运行,所以我会说您'是正确的。我已经稍微调整了我的答案。
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2013-04-16
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多