2010-02-08 80 views
6

是否有任何工具可用於剖析.Net線程爭用。我已經爲運行緩慢的Windows服務的線程添加了性能計數器。它顯示了大約150個線程爭用。我想要描述代碼的哪些部分對於如此多的線程爭用負責。有沒有可用的工具可以將我指向正確的代碼塊。剖析.Net線程爭用

回答

2
+0

是的我正在尋找類似的東西。但不幸的是我在VS.Net 2005 – Amitabh 2010-02-08 16:28:30

+0

@Amitabh:你可以在這裏下載VS2010:http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx – 2010-02-08 16:40:23

+2

VS2010可以以.NET 2.0爲目標。您只需升級項目文件(.csproj,.vbproj)和解決方案(.sln)。沒有代碼遷移是必要的。我不確定你是否可以在.NET 2.0項目中使用profiler,但是我猜這是值得的。 – 2010-02-15 21:03:12

0

不是一個分析器,但windbg與sosex.dll擴展名可以告訴你你有什麼僵局。找到它here並閱讀!dlk命令。

2

我遇到了與Visual Studio 2008項目相同的問題,所以我無法使用VS2010的線程爭用分析器。相反,我寫了一個診斷類,TimedMonitor,跟蹤等待鎖定的時間。

要使用它,你將取代:

object myLock = new object(); 
lock (myLock) { /* do work */ } 

有:

TimedMonitor timedLock = new TimedMonitor(); 
using (timedLock.Lock()) { /* do work */ } 
Console.WriteLine("Lock was entered {0} times; total wait time: {1}.", 
    timedLock.EnterCount, timedLock.WaitTime); 

如果你只使用少量簡單的鎖(即,與Monitor.Enter或鎖關鍵字),用TimedMonitor替換它們並記錄輸出可能有助於確定哪個鎖負責大部分時間等待。但是,如果您使用更復雜的託管鎖(例如ReaderWriterLock)或本地同步(例如,ManualResetEvent),它將不會有幫助,因爲它不會跟蹤這些鎖。