为啥总是在 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.ReadOnlySessionStateBehavior.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 同步还是异步

为啥在单步执行 ASP.NET MVC 控制器时,我的 VS2008 调试会话总是退出?

什么时候应该在 ASP.NET MVC 中使用异步控制器?

线程静态、ASP.NET 和异步处理程序

.NET异步性能测试(ASP.NET MVC WebAPI异步方法)