2012-08-07 41 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異步調用的。這種會話鎖定行爲表明控制器正在同步請求,在甚至沒有使用會話的情況下,這是很不理想的。