控制器中的MVC3死锁

时间:2012-08-07 00:16:39

标签: c# asp.net-mvc-3 iis-7.5 wkhtmltoimage

我正在尝试使用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的响应,该响应正在等待打印控制器释放锁定以便它可以获取页面。一些超时必须打破这种僵局。我能以某种方式安全地释放会话锁吗?

1 个答案:

答案 0 :(得分:0)

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

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