带有锁的c# Visual Studio调试器UI行为

本文关键字:Studio 调试器 UI 行为 Visual | 更新日期: 2023-09-27 18:16:53

我有一个锁中的代码块:

lock (obj)
{
  //...
}

我也有一个锁定同一个对象的属性。很简单的场景。我的问题是,如果我在我锁定的代码块内放置一个断点,然后在Visual Studio调试器中检查属性,会发生什么?调试器死锁,直到我继续执行断点后(或杀死visual studio/调试)?或者调试器根本不显示属性的任何数据(从UI在后台线程中抓取数据?)

我问的原因是我有一个属性专门(且仅)用于调试目的;当这种情况发生时,我可以偶尔不显示数据,但是由于调试器(和visual studio)的错误属性多次使调试器崩溃,我宁愿避免可能在某些时候妨碍我调试工作的代码,而这正是我试图帮助开始的!

我计划在我有更多时间的时候测试这个,但是我希望能从一个可能更了解的人那里得到一个更快的答案。

带有锁的c# Visual Studio调试器UI行为

是的,调试器在进程内部运行的单独的工作线程上执行watch表达式。它会击中属性getter和block中的锁。调试器容忍5秒钟,然后声明watch表达式不可用,并显示"函数计算超时"。

调试器会变得暴躁,它对阻塞的线程无能为力,你通常会看到"函数求值被禁用,因为前一个函数求值超时了。"必须继续执行以重新启用函数求值。"

不,调试器将显示对象的属性,即使它在lock()块内。

Lock()实际上并不阻止对对象的任何访问——它只是创建一个信号量,该信号量将阻止任何其他代码试图锁定同一对象,直到锁被释放。

我的经验是,VS.NET调试器确实会不时冻结,但它必须有一些死锁检测和调试优化来避免这些类型的问题。