如何解决问题:为什么我无法获得锁定?

问题描述:

在调试器中,当执行这样的代码行时,我“冻结”了: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

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

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

+0

如何使用它我可以找到线程或地方,“锁定”我的变量? – javapowered 2012-04-09 11:16:38

+0

你可以看到哪些线程正在运行*现在*可以减少/本地化搜索...与“Monitor.IsEntered”相同,它只会告诉你“Monitor”已经被锁定,但是谁又是另一个问题...... – Tigran 2012-04-09 12:42:59