【问题标题】:Confused with async await in MVC [duplicate]对 MVC 中的异步等待感到困惑 [重复]
【发布时间】:2017-08-10 08:38:13
【问题描述】:

我今天问了一个问题How can I run a method without waiting for long running process,我得到了一个很好的答案,ajax 解决了我的问题。 但是现在我的问题是为什么我还要使用 async await 关键字?

public async Task<ActionResult> DoSomeAsyncStuff()
{
    var model = new MyModel();
    await Task.Delay(20000);//My long-running process is getting data from an API with "HttpWebRequest".

    model.Name = "Something";
    //Assigning other model properties

    return PartialView("_InnerView", model);
}

async await 关键字不是为了避免阻塞 UI 吗?但是在网络中,与 WinForms 不同,我在网络中看不到任何阻塞 UI。即使没有 async await 关键字,上面的代码和 ajax 也能很好地工作。所以有人可以解释我为什么要使用它们以及它们的用途是什么?

【问题讨论】:

  • 一般来说:ajaxclient-sideasync/waitserver-side 异步操作的工作方式。阅读完整说明here
  • @ChristianGollhardt 我的问题是关于它们在网络而不是应用程序中的好处。在网络中,我看不到任何阻塞的 UI 问题。所以我的问题与重复的问题不同。
  • @SteveCode 的区别在哪里?甚至 Ajax 也可以从并行处理中受益。
  • 您需要阅读任务并行库。这可能是一个太大的概念,不适合一个合理的 Stack Overflow 答案。

标签: c# ajax asp.net-mvc async-await


【解决方案1】:

如果我没记错异步,在这种情况下,让您在服务器上处理更多请求:当您有延迟(等待来自 SQL 的数据?FS?)时,可能会接受另一个请求并开始其循环。

【讨论】:

  • 实际上当你等待时,该线程将被释放,并将其发送回线程池。所以任何其他请求都可以使用它..
  • 谢谢@PowerStar,这正是我想说的,可能我不太清楚:)
  • @PowerStar 当您等待时,该线程将被释放并将其发送回线程池。那么等待的任务在线程释放时运行在哪里?
  • @SteveCode 实际上那时你的系统不会关心这个。一旦等待的过程完成,就会向您发送一个回调标志。因此,此时将创建新线程以继续该过程。
  • @PowerStar 好吧,如果系统不关心那等待的过程怎么可能完成。它不应该至少在线程或类似的东西上运行吗?我想知道它在哪里运行直到它完成?
【解决方案2】:

请求是异步的原因是允许单个线程处理多个请求,而不是与 UI 相关的任何内容(服务器实际上并没有 UI,它只是以某种方式返回文件或数据)。如果该方法是同步的,则处理此请求的线程将在您等待时被阻塞,如果您一次接收大量请求,您可以快速积累您使用的线程数。由于线程确实会带来一些开销,因此这会对服务器的性能产生负面影响。

通过使用 async/await,这个线程被释放来同时处理另一个请求,这比仅仅阻塞一个线程一会儿更快更高效。在您的示例中,一个线程可以同时处理多个 DoSomeAsyncStuff() 调用 - 当它命中 await Task.Delay(20000); 时,可以从先前命中的 await 或从方法的开头恢复另一个请求。

【讨论】:

  • 这个线程被释放来同时处理另一个请求。那么等待的任务在线程释放时运行在哪里?
  • 当等待的任务完成时,如果原始线程正在被另一个请求使用,它将在其原始线程或线程池中的另一个线程上恢复。
  • 谢谢,但我的问题是当等待的任务在这个完成过程中完成时,它应该使用一些线程来完成。不是?如果系统不关心那等待的过程将如何完成。它不应该至少在线程或类似的东西上运行吗?我想知道它在哪里运行直到它完成?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多