ASPNET核心和异步执行

时间:2016-09-19 21:16:25

标签: async-await asp.net-core

我仍然试图了解如何以及何时在asp.net中使用async方法,我可以问十几个关于它的问题,但这种行为对我来说是令人惊讶的.. 。如果我创建一个async方法但是将其声明为void,然后不等待它,那么我已经阅读了所有内容,它基本上就像你刚刚运行它一样工作线程上的异步代码,没有闲逛以获得结果。也就是说,空格会立即返回给调用者,调用者可以开始它的业务,并可能在async方法之前完成。但在我的.net核心应用程序中,绝对不是这样。我有一个async void,我从另一个异步方法调用,虽然我没有awaitasync代码上的线程阻塞。这里发生了什么?

感谢。

1 个答案:

答案 0 :(得分:7)

  

我仍然试图了解如何以及何时在asp.net中使用异步方法

你在以下时间使用它们:

  1. 你有异步工作要做。一般来说,这意味着I / O绑定,而不是CPU绑定。
  2. 你的后端秤。例如,它是一个WebAPI,NoSQL服务,SQL Server集群等。如果您的后端是单个SQL Server实例,则它不可扩展,并且没有必要在您的Web层上使用异步。
  3.   

    它基本上就像你在工作线程上运行那个异步代码一样

    没有。 async void只是阻止调用者检测它何时完成。它仍然在与调用者相同的上下文中运行,就像async Task方法一样。

      

    异步代码上的线程阻塞

    您的“异步”代码可能实际上是同步的。如果它没有await,则编译器会警告您它是同步的。

    您可能会发现我的intro to async博文和async on ASP.NET MSDN文章很有帮助。就async而言,ASP.NET Core只改变了一些事情:1)没有更多的ASP.NET请求上下文,2)整个管道是异步兼容的,所以像异步过滤器和异步视图组件正常工作。