我在锁中有一段代码:
lock (obj)
{
//...
}
我还有一个锁定同一个对象的属性。足够简单的场景。我的问题是,如果我在我锁定的代码块中放置一个断点,然后检查Visual Studio调试器中的属性,会发生什么?调试器是否会死锁,直到我在断点后继续执行(或者杀死visual studio / debugging)?或者调试器是否只显示该属性的任何数据(从UI中获取后台线程中的数据?)
我问的原因是我有一个专门(并且仅)用于调试目的的属性;我很乐意在这种情况发生时偶尔没有显示数据,但是多次使用糟糕的调试器属性来破坏调试器(和visual studio),我宁愿避免在某些时候阻碍我的调试工作的代码。我正在努力帮助开始!
我打算在我有更多时间的时候对此进行测试,但我希望得到更好的回答。
答案 0 :(得分:3)
是的,调试器在进程内运行的单独工作线程上执行监视表达式。哪个会在你的属性getter和block中命中 lock 。调试器使用它5秒,然后声明监视表达式不可用并显示“函数评估超时”。
然后调试器变得脾气暴躁,对于被阻塞的线程没什么用,你通常会看到“功能评估被禁用,因为之前的功能评估超时了。你必须继续执行才能重新启用功能评估。”哪个是好建议。
答案 1 :(得分:2)
即使对象属于lock()
块,调试器也不会显示对象的属性。
Lock()对象实际上并不会阻止对对象的任何访问 - 它只是创建一个信号量,它将阻止任何试图锁定同一对象的其他代码,直到锁被释放。
答案 2 :(得分:1)
我的经验是VS.NET调试器不时会冻结,但它必须有一些死锁检测和调试优化,以避免这些类型的问题。