繁体   English   中英

控制器中的MVC3死锁

[英]MVC3 Deadlocks in Controller

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM