Поведение пользовательского интерфейса отладчика C # Visual Studio с блокировкой - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть блок кода в замке:

lock (obj)
{
  //...
}

У меня также есть свойство, которое блокирует этот же объект. Довольно простой сценарий. Мой вопрос заключается в том, что если я поставлю точку останова внутри заблокированного блока кода, а затем проверим свойство в отладчике Visual Studio, что произойдет? Будет ли отладчик тупиковым, пока я не продолжу выполнение после точки останова (или убью visual studio / debugging)? Или же отладчик просто не показывает никаких данных для свойства (получение данных в фоновом потоке из пользовательского интерфейса?)

Причина, по которой я спрашиваю, заключается в том, что у меня есть свойство специально (и только) для целей отладки; Я согласен, что время от времени я не показываю данные, когда происходит такой сценарий, но много раз сбой отладчика (и visual studio) с плохими атрибутами отладчика, я бы предпочел избегать кода, который в какой-то момент может помешать моим усилиям по отладке, с чего я пытаюсь помочь для начала!

Я планирую проверить это в какой-то момент, когда у меня будет больше времени, но я надеялся на более быстрый ответ от кого-то, кто мог бы знать лучше.

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Да, отладчик выполняет выражения наблюдения в отдельном рабочем потоке, который выполняется внутри процесса. Который ударит по замку в вашем свойстве getter и block. Отладчик выдерживает это в течение 5 секунд, затем объявляет выражение для часов непригодным для использования и отображает «Тайм-аут оценки функции».

После этого отладчик становится сварливым, мало что он может сделать с этим заблокированным потоком. Обычно вы увидите «Оценка функции отключена, поскольку истек срок предыдущей оценки функции. Вы должны продолжить выполнение до повторного включения оценки функции». Какой хороший совет.

2 голосов
/ 07 декабря 2011

Нет, отладчик не покажет вам свойства объекта, даже если он находится внутри блока lock().

Блокировка () объекта фактически не препятствует доступу к объекту - он просто создаетсемафор, который будет блокировать любой другой код, который пытается заблокировать тот же объект, пока блокировка не будет снята.

1 голос
/ 07 декабря 2011

Мой опыт показывает, что отладчик VS.NET время от времени останавливается, но для устранения проблем такого типа он должен иметь определенное обнаружение взаимоблокировок и отладку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...