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

本文关键字:异步操作 应用程序 net mvc asp | 更新日期: 2023-09-27 18:22:04

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

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

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

有人能帮我解决我的问题吗?谢谢!:-)

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

我认为这看起来不应该是异步请求。

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

您所想到的是一种"fire-and-forget"执行风格,即在线程池上对委托进行排队并立即返回控制。这种性质并不适合ASP.NET,如果您的应用程序需要任何规模,肯定会影响性能。

当您使用'await'时,您告诉C#等待操作完成。尝试在不使用'await'关键字的情况下调用异步方法。类似:

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

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