2009-02-20 28 views
1

遵守下列僞:如何安全地使用WaitHandles來防止死鎖?

ManualResetEvent[] resetEvents = new ManualResetEvent[operations.Count]; 

for(int i = 0; i < operations.Count; i++) 
{ 
    resetEvents[i] = new ManualResetEvent(false); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(timeConsumingOpHandler), resetEvents[i]); 
} 

WaitHandle.WaitAll(resetEvents); 

在裏面的池線程之一,我的ASP.NET Web應用程序被死鎖發生異常的情況。響應流上沒有傳遞異常信息。 我正在尋求防止這種情況的建議。固定超時是可以接受的。 假設timeConsumingOpHandler Set()是WaitHandle。

整個timeConsumingOpHandler被封裝在finally節中的WaitHandle被設置爲()的try-catch-finally塊中。無論如何,發生死鎖。

回答

0

任何阻止操作都是潛在的死鎖。有幾種方法可以最大限度地減少或幾乎消除發生死鎖的機會(如果您始終確保同步操作在有限的時間內完成),但在一般情況下,您不能假設有一種安全的方法防止死鎖。

在確保您的應用程序沒有死鎖的情況下,超時會很長,但您會停滯不前,並且需要以特殊方式從超時中恢復。同樣的程序流程不再適用。

如果你有線程拋出異常檢查Visual Studio中的調試>輸出窗口,它似乎總是會捕獲異常,即使調試器在處理多線程時無法中斷。

看起來你正在將工作分解成單獨的線程,以實現並行性。爲什麼在ASP.NET應用程序中需要這個?

1

你確定你處於僵局嗎?在.NET 2.0中,ThreadPoolterminate the process中的未處理異常。

您不應在ASP.NET應用程序中使用ThreadPool。 ASP.NET本身使用ThreadPool來爲請求提供服務,因此您正在爭奪相同的一組線程。如果您必須有異步執行,請使用異步委託。

+0

一個很好的提示。謝謝。 – Kivin 2009-02-20 22:22:16

0

您可能需要查看MSDN上Joe Duffy開發的自定義CLR host以提供自動死鎖檢測。

相關問題