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

C# 为什么总是在asp.net mvc中同步异步操作(;异步等待);,c#,asp.net,asp.net-mvc,asynchronous,async-await,C#,Asp.net,Asp.net Mvc,Asynchronous,Async Await,我想在“action”中使用async,但当我同时访问带有3个选项卡的页面时,它总是同步的 我发现下一个标签页的“开始时间”是上一个标签页的“结束时间”。所以它是同步的而不是异步的 非常感谢 public class TestController : Controller { public async Task<string> Index() { return await Task.Run(() => {

我想在“action”中使用async,但当我同时访问带有3个选项卡的页面时,它总是同步的

我发现下一个标签页的“开始时间”是上一个标签页的“结束时间”。所以它是同步的而不是异步的

非常感谢

    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());
        });
    }
}
公共类TestController:Controller
{
公共异步任务索引()
{
返回等待任务。运行(()=>
{
List lst=新列表();
Add(string.Format(“startTime:{0}”,DateTime.Now.ToString());
var s=新秒表();
s、 Start();
系统线程线程睡眠(10000);
s、 停止();
Add(string.Format(“endTime:{0}”,DateTime.Now.ToString());
Add(string.Format(“total:{0}”,s.appeased.TotalSeconds.ToString());
返回字符串.Join(“
”,lst.ToArray()); }); } }

实际上,它与async/await无关,您将其与并行请求执行混淆了

关于您的问题,我猜这是由于会话锁定造成的。 默认情况下,ASP.NET MVC处理程序在每个会话中一次处理一个请求。原因是MVC处理程序假定在每个请求上都可以修改会话,并且所有顺序请求都需要使用最新的会话值进行处理。通过在控制器上设置正确的
sessionstatebhavior.ReadOnly
sessionstatebhavior.Disabled
,可以轻松更改此行为:

[SessionState(SessionStateBehavior.ReadOnly)]
public class TestController : Controller
{
    public async Task<string> Index()
    {
        return await Task.Run(() =>
        {
            ...
        });
    }
}
[SessionState(SessionStateBehavior.ReadOnly)]
公共类TestController:控制器
{
公共异步任务索引()
{
返回等待任务。运行(()=>
{
...
});
}
}

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

实际上,它与async/await无关,您将其与并行请求执行混淆

关于您的问题,我猜这是由于会话锁定造成的。 默认情况下,ASP.NET MVC处理程序在每个会话中一次处理一个请求。原因是MVC处理程序假定在每个请求上都可以修改会话,并且所有顺序请求都需要使用最新的会话值进行处理。通过在控制器上设置正确的
sessionstatebhavior.ReadOnly
sessionstatebhavior.Disabled
,可以轻松更改此行为:

[SessionState(SessionStateBehavior.ReadOnly)]
public class TestController : Controller
{
    public async Task<string> Index()
    {
        return await Task.Run(() =>
        {
            ...
        });
    }
}
[SessionState(SessionStateBehavior.ReadOnly)]
公共类TestController:控制器
{
公共异步任务索引()
{
返回等待任务。运行(()=>
{
...
});
}
}

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

您可能误解了什么是异步控制器方法。这意味着在长时间运行的任务中,线程返回到线程池,因此可以处理更多的请求(这不会减少方法执行所需的时间)。但用户界面总是在等待。直到上一个请求完成。这与使您的方法异步无关。您可能误解了什么是异步控制器方法。这意味着在长时间运行的任务中,线程返回到线程池,因此可以处理更多的请求(这不会减少方法执行所需的时间)。但用户界面总是在等待。直到上一个请求完成。这与使您的方法异步无关。我尝试了一下,仍然如此。这是vs刚刚创建的一个新的mvc项目。我尝试了一下,仍然如此。这是vs刚刚创建的一个新的mvc项目。