我正在尝试在ASP.NET MVC中实现异步操作。代码如下所示:
[HttpGet]
public async Task<string> HeavyAction(int holdTime)
{
await Task.Delay(holdTime);
return "Now I'm done!";
}
此操作显示主要问题,即当用户使用大参数值(10000)调用操作时,应用程序无响应 - 请求已发送但浏览器正在等待响应。我认为不应该看一个异步请求。在我看来,用户应该能够同时调用其他操作。
有人可以帮我解决问题吗?谢谢! : - )
答案 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。