2012-04-09 135 views
1

在調試器中,當執行這樣的代碼行時,我「凍結」了:lock (myvar)顯然其他人持有myvar。不過,我期望在這條線上myvar應該是免費的。所以我想知道哪部分代碼holdes myvar(來自另一個線程diffenetely)。我怎樣才能做到這一點?我知道哪個線程擁有它(因爲我只有另一個線程),但我不知道在哪裏。如何解決問題:爲什麼我無法獲得鎖定?

UPD解決了,我忘了打電話給Monitor.Exit(myvar)後一個Monitor.TryEnter(myvar)

+1

究竟有多少鎖語句並您的代碼有? – 2012-04-09 08:16:44

+0

@AndrewBarber我只有一個鎖的聲明,我不明白它如何保持鎖定。所以我想確保在調試器中存在那個問題....我已經決定添加Console.Writeln(「get lock」)和Console.Writeln(「釋放鎖定」)跟蹤... – javapowered 2012-04-09 08:49:03

+0

那些'控制檯。 Writeline()的代價非常昂貴,可能會改變計時。 – 2012-04-09 09:06:09

回答

2

lock()語句使用Monitor類不支持查詢自鎖螺紋。
在Fx 4.5中,您可以檢查Monitor.IsEntered(myVar),但這就是它。

其餘的應該來自​​您的代碼的邏輯。

+0

有一個'Monitor.IsEntered'方法? – Jon 2012-04-09 08:17:24

+0

@Jon只有當你使用.NET 4.5。 – hangy 2012-04-09 08:20:34

+0

@Jon - 只在最新版本中。編輯。 – 2012-04-09 08:20:53

3

如果您正在使用Visual Studio 2010你可以看一下Parallel Stacks

+0

如何使用它我可以找到線程或地方,「鎖定」我的變量? – javapowered 2012-04-09 11:16:38

+0

你可以看到哪些線程正在運行*現在*可以減少/本地化搜索...與「Monitor.IsEntered」相同,它只會告訴你「Monitor」已經被鎖定,但是誰又是另一個問題...... – Tigran 2012-04-09 12:42:59

相關問題