为啥总是在 asp.net mvc 中同步异步操作(async await)
Posted
技术标签:
【中文标题】为啥总是在 asp.net mvc 中同步异步操作(async await)【英文标题】:why always sync in asp.net mvc with asynchronous action(async await)为什么总是在 asp.net mvc 中同步异步操作(async await) 【发布时间】:2017-05-02 22:44:24 【问题描述】:我想在“动作”中使用异步,但是当我同时访问带有 3 个选项卡的页面时,它总是同步的。
我发现下一个标签页的“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());
);
【问题讨论】:
您可能误解了什么是异步控制器方法。这意味着在长时间运行的任务期间,线程被返回到线程池,因此可以处理更多的请求(它不会减少方法执行所花费的时间)。 Asynchronous Methods in ASP.NET 但是 ui 头总是在等待。直到上一个请求完成。 这与使您的方法异步无关。 【参考方案1】:实际上它与 async/await 无关,您将它与并行请求执行混淆了。
关于你的问题,我猜这是由于会话锁定而发生的。
默认情况下,ASP.NET MVC 处理程序在每个会话一次处理一个请求。原因是 MVC 处理程序假定每个请求会话都可以修改,并且所有顺序请求都需要使用最新的会话值进行处理。您可以通过在控制器上设置正确的 SessionStateBehavior.ReadOnly
或 SessionStateBehavior.Disabled
轻松更改此行为:
[SessionState(SessionStateBehavior.ReadOnly)]
public class TestController : Controller
public async Task<string> Index()
return await Task.Run(() =>
...
);
通过应用此属性,您可以禁用会话锁定并允许在同一个会话对象上并行执行多个请求。
【讨论】:
我试了一下,还是这样。而且是刚刚vs新建的mvc项目。以上是关于为啥总是在 asp.net mvc 中同步异步操作(async await)的主要内容,如果未能解决你的问题,请参考以下文章
为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]
ASP.NET mvc4 Controllder 同步还是异步