2016-12-17 50 views
1

我想在“操作”中使用异步,但当我同时访问带有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()); 
     }); 
    } 
} 

enter image description here

+1

您可能会误解异步控制器的方法。这意味着在长时间运行的任务中,线程返回到线程池,因此可以处理更多的请求(它不会减少该方法执行的时间)。 [ASP.NET中的异步方法](https://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4) –

+0

但ui thead始终等待。直到前一个请求完成。 –

+0

这与使您的方法异步无关。 –

回答

0

实际上却无关异步/等待你与并行请求执行混淆了。

关于你的问题,我的猜测是,这是由于会话锁定。 默认情况下,ASP.NET MVC处理程序在每个会话的时间处理一个请求。原因是MVC处理程序假定每个请求会话都可以被修改,并且所有顺序请求都需要使用最新的会话值进行处理。您可以轻松地在您的控制器设置正确SessionStateBehavior.ReadOnlySessionStateBehavior.Disabled改变这种行为:

[SessionState(SessionStateBehavior.ReadOnly)] 
public class TestController : Controller 
{ 
    public async Task<string> Index() 
    { 
     return await Task.Run(() => 
     { 
      ... 
     }); 
    } 
} 

通过应用此属性禁用会话锁定,并允许多个请求相同的并行会话对象上执行。

+0

我尝试过,它仍然如此。这是一个由刚刚创建的新的mvc项目。 –