为什么总是在异步操作(异步等待)中同步在asp.net mvc中
问题描述:
我想在“操作”中使用异步,但当我同时访问带有3个选项卡的页面时,它总是同步。为什么总是在异步操作(异步等待)中同步在asp.net mvc中
我发现下一个标签页的'startTime'是前一个标签'endTime'。所以它的同步不是异步。
非常感谢。
public class TestController : Controller
{
public async Task<string> Index()
{
return await Task.Run(() =>
{
List<string> lst = new List<string>();
lst.Add(string.Format("startTime:{0}", DateTime.Now.ToString()));
var s = new Stopwatch();
s.Start();
System.Threading.Thread.Sleep(10000);
s.Stop();
lst.Add(string.Format("endTime:{0}", DateTime.Now.ToString()));
lst.Add(string.Format("total:{0}", s.Elapsed.TotalSeconds.ToString()));
return string.Join("<br/>", lst.ToArray());
});
}
}
答
实际上却无关异步/等待你与并行请求执行混淆了。
关于你的问题,我的猜测是,这是由于会话锁定。 默认情况下,ASP.NET MVC处理程序在每个会话的时间处理一个请求。原因是MVC处理程序假定每个请求会话都可以被修改,并且所有顺序请求都需要使用最新的会话值进行处理。您可以轻松地在您的控制器设置正确SessionStateBehavior.ReadOnly
或SessionStateBehavior.Disabled
改变这种行为:
[SessionState(SessionStateBehavior.ReadOnly)]
public class TestController : Controller
{
public async Task<string> Index()
{
return await Task.Run(() =>
{
...
});
}
}
通过应用此属性禁用会话锁定,并允许多个请求相同的并行会话对象上执行。
+0
我尝试过,它仍然如此。这是一个由刚刚创建的新的mvc项目。 –
您可能会误解异步控制器的方法。这意味着在长时间运行的任务中,线程返回到线程池,因此可以处理更多的请求(它不会减少该方法执行的时间)。 [ASP.NET中的异步方法](https://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4) –
但ui thead始终等待。直到前一个请求完成。 –
这与使您的方法异步无关。 –