我的應用程序在對lock (obj)
的調用中無限期地被阻止,但線程窗口中沒有任何其他線程有任何代碼可以瀏覽。有沒有必要有另一個線程參與?爲什麼它沒有出現,並且它沒有出現的原因是什麼?如何在Visual Studio中只顯示一個線程時調試死鎖?
更新:我想我找出是什麼原因造成的。我有這種黑客塊,我會Wait()
在兩個鎖裏面的ManualResetEvent
。問題是我需要等待,以便其他線程可以使用它們之前釋放這些鎖,所以我在做這樣的事情:
lock (one) {
lock (two) {
...
Monitor.Exit(two);
Monitor.Exit(one);
syncEvent.Wait();
Monitor.Enter(one);
Monitor.Enter(two);
}
}
我並沒有指望的是,Monitor.Exit()
實際上只是減少一個內部遞歸計數器,並且有可能從已經同步的塊中調用該方法;因此該鎖實際上並不是發佈的。
我想這是一個壞主意開始。自那時起,我就把電話轉到Wait()
以外的鎖定區域,現在看起來工作正常。
感謝您的洞察力。
儘管現在我想到了,如果方法是從其中一個鎖上同步的代碼調用的,當發生對Wait
的調用時,它仍不會被釋放。因此,我想必須小心,不要從同步塊中調用它。
可能那些其他線程已經走了 - 還是還沒有創建? – user492238 2011-04-11 17:20:46