控制器中的MVC3死锁

本文关键字:死锁 MVC3 控制器 | 更新日期: 2024-10-21 00:41:30

我正在尝试使用wkhtmltoimage对地图进行光栅化。我正在启动一个新进程,并将获得所需图像所需的命令行参数传递给它。

当这个过程开始的时候,我正在经历一段很长的停顿。我已经启用了显示窗口,以查看是否有任何与对话框相关的活动需要用户输入,但没有。进程在0%CPU下运行2-3分钟。在类似的命令上执行相同的命令需要几秒钟的时间。

using (Process p = new Process())
{
    ProcessStartInfo info = new ProcessStartInfo(wkhtmlPath, dimensions + EscapeArgument(location) + " -");
    info.UseShellExecute = false;
    info.RedirectStandardOutput = true;
    p.StartInfo = info;
    p.Start();
    byte[] buffer = new byte[32768];
    int read = 0;
    while ((read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        //... write bytes to the an ouput buffer
    }
}

完成大约需要几分钟。当它不指向使用同一会话的我的一个控制器时,它工作得很好。当使用同一会话时,打印控制器会等待wkhtmltoimage的响应,该响应正在等待打印控制器释放锁定,以便获取页面。一定是超时打破了这个僵局。我能以某种方式安全地释放会话锁定吗?

控制器中的MVC3死锁

默认情况下,MVC3中的控制器操作在用户会话上同步。重新发出具有相同会话令牌的请求会导致死锁。重新发出的请求等待发出请求的请求放弃对会话的锁定。我通过根本不使用会话作为切入点来解决这个问题,但这可能不是最好的解决方案。

在没有进一步调查的情况下,最好的解决方案是开始考虑异步控制器。我编写的许多控制器操作都是通过ajax异步调用的。这种会话锁定行为表明控制器正在同步请求,这在甚至没有使用会话的情况下是不理想的。