2012-08-07 37 views
0

我想使用wkhtmltoimage栅格化地图。我正在启动一个新进程,并向其传递必要的命令行参数以获取我想要的映像。控制器中的MVC3死锁

当前进程启动时,我目前正处于非常长时间的停顿状态。我已经启用显示窗口来查看是否有任何需要用户输入但没有任何对话相关的活动。该进程在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的响应,该响应正在等待打印控制器释放锁,以便它可以获取页面。一些超时必须打破这种僵局。我可以安全地释放会话锁吗?

+0

为什么你不使用TPL解决这个问题? 我想你重新考虑你的应用逻辑。 – IamStalker 2012-08-07 07:45:10

回答

0

默认情况下,MVC3中的控制器操作在用户会话上同步。使用相同的会话标记重新发出请求会导致死锁。重新发出的请求会等待发出该请求的请求放弃会话锁定。我解决了这个问题,因为根本没有为进入点使用会话,但它可能不是最好的解决方案。

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