为什么总是在asp.net mvc中使用异步操作同步(异步等待)

时间:2016-12-17 07:02:11

标签: c# asp.net asp.net-mvc asynchronous async-await

我想在' action'中使用async,但是当我同时访问包含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());
        });
    }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

实际上它与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(() =>
        {
            ...
        });
    }
}

通过应用此属性,您可以禁用会话锁定,并允许在同一会话对象上并行执行多个请求。