2011-07-08 80 views
0

我在我的代碼中的鎖關鍵字。它凍結,因爲別的東西被鎖定。有什麼樣的命令或實用程序可以用來查看誰或什麼?誰鎖定我的東西在C#中使用鎖關鍵字

+0

請解釋你正在鎖定什麼。一個類型,一個私人對象,一個公共對象,一個靜態字段? (通過顯示相關代碼進行最佳解釋。) –

回答

2

您可以連接到使用WinDbg的過程,並使用sosex.dll看到與DLK命令僵持不下什麼的線程虛擬對象。

http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx

+0

使用Visual Studio更容易附加並轉儲線程調用堆棧。 –

+0

@Steve如果它發生在你的桌面上,並且線程數很少。有時在用戶計算機上甚至從內存轉儲中運行windbg更容易 –

+0

同意,IDE並不總是可行的 - 儘管如此,使用IDE(或Windbg)的遠程連接也是可能的。 –

2

如果您正在使用鎖定,那麼您應該在您控制的對象上使用它。通常,這是隻用於你的鎖即

Object lockObj = new Object(); 
//some code 
void MyCoolFunc() 
{ 
    lock(lockObj) 
    { 
     //do some not threadsafe stuff 
    } 
} 
0

不幸的是,沒有簡單的答案...但你可以使用的工具,如CHESS來幫助你前進的道路。最終,您可能必須檢查您的代碼是否存在可能導致死鎖的競爭條件。任何看到鎖定語句或其他線程同步對象(例如監視器,互斥鎖等)的地方,您都需要檢查它們以查看鎖定的內容並找到鎖定同一事物的其他代碼段

0

我認爲您可以使用VS.NET附加到掛起的進程並單擊暫停。然後調用線程窗口(調試 - > Windows - >線程)並檢查哪些線程被鎖定以及爲什麼。這看起來是最簡單的解決方案。