asp.net mvc应用程序中的异步操作

时间:2015-11-15 20:23:51

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

我正在尝试在ASP.NET MVC中实现异步操作。代码如下所示:

[HttpGet]
public async Task<string> HeavyAction(int holdTime)
{
      await Task.Delay(holdTime);
      return "Now I'm done!";
}

此操作显示主要问题,即当用户使用大参数值(10000)调用操作时,应用程序无响应 - 请求已发送但浏览器正在等待响应。我认为不应该看一个异步请求。在我看来,用户应该能够同时调用其他操作。

有人可以帮我解决问题吗?谢谢! : - )

2 个答案:

答案 0 :(得分:3)

  

我认为不应该看异步请求。

您对“async-await”的工作方式存在误解。当您的方法等待异步方法时,控制权将返回给调用者,在本例中为ASP.NET运行时。但是,async-await不会改变HTTP协议的请求 - 响应性质。因此,只有Task.Delay完成后,下一行代码才会执行​​并向调用者返回一个响应。

您正在考虑的是一种“即发即弃”的执行方式,您可以在线程池中对委托进行排队并立即返回控制权。这种性质并不适合ASP.NET,如果您的应用需要任何规模,肯定会损害性能。

答案 1 :(得分:0)

当你使用'await'时,你告诉C#等待动作完成。尝试在没有'await'关键字的情况下调用异步方法。像:

[HttpGet]
public async Task<string> HeavyAction(int holdTime)
{
      Task.Delay(holdTime);
      return "Now I'm done!";
}

因此该方法将立即返回并稍后执行Task.Delay。