C# 如何排除故障:为什么我可以';你拿不到锁吗?
在调试器中,当执行这样一行代码时,我“冻结”了:C# 如何排除故障:为什么我可以';你拿不到锁吗?,c#,visual-studio-2010,C#,Visual Studio 2010,在调试器中,当执行这样一行代码时,我“冻结”了:lock(myvar)显然有人在持有myvar。然而,我希望在这一行,myvar应该是免费的。因此,我想知道代码的哪一部分保存着myvar(不同于另一个线程)。我该怎么做?我知道哪个线程持有它(因为我只有一个其他线程),但我不知道在哪里 upd问题解决后,我忘记在一个Monitor.TryEnter(myvar)之后调用Monitor.Exit(myvar)lock()语句使用了Monitor类,该类不支持查询锁定线程。 在fx4.5中,您可以检查
lock(myvar)
显然有人在持有myvar
。然而,我希望在这一行,myvar
应该是免费的。因此,我想知道代码的哪一部分保存着myvar
(不同于另一个线程)。我该怎么做?我知道哪个线程持有它(因为我只有一个其他线程),但我不知道在哪里
upd问题解决后,我忘记在一个Monitor.TryEnter(myvar)之后调用Monitor.Exit(myvar)
lock()
语句使用了Monitor
类,该类不支持查询锁定线程。
在fx4.5中,您可以检查Monitor.IsEntered(myVar)
,仅此而已
其余部分应该来自代码的逻辑 语句使用不支持查询锁定线程的Monitor
类。在fx4.5中,您可以检查Monitor.IsEntered(myVar),仅此而已
其余部分应该来自代码的逻辑 如果您使用的是
Visual Studio 2010
您可以查看如果您使用的是Visual Studio 2010
您可以查看您的代码有多少个锁语句???@AndrewBarber我只有一个锁语句,我不明白它如何保持锁。所以我想在调试器中确定问题是否存在。。。。我决定添加Console.Writeln(“获取锁”)和Console.Writeln(“释放锁”)跟踪…那些Console.Writeline()
s非常昂贵,可能会改变时间。@Henkholtman我知道,但这至少是我可以尝试的。你的代码有多少个lock语句???@AndrewBarber我只有一个lock语句,我不明白它是如何保持lock的。所以我想在调试器中确定问题是否存在。。。。我决定添加Console.Writeln(“获取锁”)和Console.Writeln(“释放锁”)跟踪…那些Console.Writeline()
s非常昂贵,可能会改变时间。@Henkholtman我知道,但这至少是我可以尝试的。有一个监视器.IsEntered
方法?@Jon仅当您使用.NET 4.5时使用。@Jon-仅在最新版本中使用。这意味着除了查看代码之外,我没有其他方法了?如果我没有发现问题,我最好看看我的代码:)只有在使用.NET 4.5时才有监视器.IsEntered
方法?@Jon.@Jon-仅在最新版本中。这意味着除了查看代码之外,我没有其他方法了?如果我没有发现问题,我最好看看我的代码:)如何使用它我可以找到线程或地方“锁定”我的变量?你可以看到哪些线程正在运行可以减少/本地化搜索。。。与Monitor.IsEntered相同,它只通知您Monitor
已被锁定,但这是另一个问题…如何使用它我可以找到线程或“锁定”我的变量的位置?您可以看到现在正在运行的线程可以减少/本地化搜索。。。与Monitor.IsEntered
相同,它只通知您监视器
已锁定,但由谁锁定是另一个问题。。。