分析.Net线程争用

时间:2010-02-08 15:57:54

标签: .net multithreading

是否有任何工具可用于配置.Net线程争用。我已经为运行缓慢的Windows服务的线程添加了性能计数器。它显示了大约150个线程争用。我想分析一下代码的哪个区域负责了很多Thread争用。有没有可用的工具可以指向正确的代码块。

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分: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或lock关键字),则将它们替换为TimedMonitor并记录输出可能有助于确定哪个锁负责等待的最长时间。但是,如果您使用的是更复杂的托管锁(例如,ReaderWriterLock)或本机同步(例如,ManualResetEvent),则它不会有用,因为它不会跟踪它们。

答案 2 :(得分:0)

不是分析器,但带有sosex.dll扩展名的windbg可以告诉你你遇到了什么死锁。查找它here并阅读有关!dlk命令。