0

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

4

1 回答 1

0

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

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

于 2012-08-27T04:55:51.647 回答