MVC 4 Async Action 不处理等待之间的多个请求

Kay*_*yes 1 c# asynchronous asp.net-mvc-4

我正在尝试测试我从这里阅读最多的 MVC4 异步控制器操作:http : //www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4

下面是我的控制器:

public class HomeController : AsyncController
{
    //
    // GET: /Home/

    public async Task<ActionResult> Index()
    {
        WriteOnFile("Here dude. Time: " + DateTime.Now.ToString("HH:mm:ss:fff"));
        await Task.Delay(10000);
        return View();
    }

    private void WriteOnFile(string text)
    {
        using (Mutex mutex = new Mutex(false, "TempFile"))
        {
            mutex.WaitOne();
            using (var writer = new StreamWriter(@"D:\Temp\temp.txt", true))
            {
                writer.WriteLine(text);
            }
            mutex.ReleaseMutex();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在通过打开指向 ~/home/index 的 5 个浏览器选项卡并一次刷新它们来测试这一点。

以下是我得到的输出:

  • 这里哥们。时间:09:09:04:108
  • 这里哥们。时间:09:09:14:129
  • 这里哥们。时间:09:09:24:160
  • 这里哥们。时间:09:09:34:176
  • 这里哥们。时间:09:09:44:200

时间戳相隔 10 秒。这意味着在前一个请求完成后处理每个请求。这就是同步控制器动作所做的,但我希望异步控制器动作能够在等待时处理请求。为什么 async 在上面的例子中不起作用?我做错了什么?

我在带有 .net 4.5 的 Windows 8.1 中使用 IIS 8.5。

提前致谢。

Kas*_*dum 5

默认情况下,ASP.NET MVC 取决于会话状态。ASP.NET 将阻止来自同一源的并发请求,如果它们依赖于会话状态。这就是为什么您会看到一次执行一次并发请求。请参阅此问题以获取进一步说明。

此外,AsyncController 已过时。改用普通控制器,您包装在 async/Task/Task 中的任何方法都会自动异步,就像它们在普通代码中一样。

您有两种选择:禁用对会话的依赖或使用 Web API,默认情况下不依赖会话,因此将同时运行。