C#lock(),以获取度量?
我在应用程序中使用C#lock()来确保没有两个或多个线程同时执行同一代码块。lock()是在我发生碰撞后添加的,因此我知道这是可能的,并且会发生不好的事情 现在我正试图找出如何获得某种反馈/计数器,我可以用它来确定锁被击中的频率。我假设我必须连接到Monitor类才能获得此信息,但我想问一下以前是否有人解决过此问题?您可以使用它来确定CLR获取线程锁的失败尝试总数(总争用次数)或每秒争用率(争用率/秒) 注意,这是总数,因此如果应用程序中有多个线程争用场景,这种方法不会将它们分成单独的计数C#lock(),以获取度量?,c#,multithreading,C#,Multithreading,我在应用程序中使用C#lock()来确保没有两个或多个线程同时执行同一代码块。lock()是在我发生碰撞后添加的,因此我知道这是可能的,并且会发生不好的事情 现在我正试图找出如何获得某种反馈/计数器,我可以用它来确定锁被击中的频率。我假设我必须连接到Monitor类才能获得此信息,但我想问一下以前是否有人解决过此问题?您可以使用它来确定CLR获取线程锁的失败尝试总数(总争用次数)或每秒争用率(争用率/秒) 注意,这是总数,因此如果应用程序中有多个线程争用场景,这种方法不会将它们分成单独的计数
您可以使用内置于VisualStudio中的探查器获得有关并发性问题的更详细信息。如果您使用的是VS 2015,您可能希望查看(VS 2017尚未提供)。根据您是否想知道您获得锁的次数,您有两种选择:
很明显,但会告诉您在锁中花费了多少时间,这可能比计数更有用:
private long _lockTicks = 0;
.....
var sw = StopWatch.StartNew();
lock(_locker)
{
sw.Stop();
_lockTicks += sw.ElapsedTicks;
//dostuff
}
......
double seconds = (double)_lockTicks / StopWatch.Frequency;
可能的副本不是真正的副本,因为OP希望重新创建本机锁定机制。这个问题是关于获取指示线程争夺锁资源的频率的指标。2和另一个问题似乎是可以接受的方法。因为我想要锁,所以TryEnter()将在一个while循环中,直到我成功,如果我不能得到锁,我将更新一次计数器(不管我有多少次没有得到它)。谢谢大家的建议。