Я нашел страницу MSDN под названием " Как: обновить значения наблюдения ", объясняющую это:
Когда вы оцениваете выражение в отладчике, в столбце Значение может появиться один из двух значков обновления. Один значок обновления представляет собой круг, содержащий две стрелки, которые вращаются в противоположных направлениях. Другой - это круг, содержащий две волнистые линии, напоминающие нити.
...
Если появляются два потока, выражение не было оценено из-за потенциальной зависимости между потоками. Межпотоковая зависимость означает, что для оценки кода требуются другие потоки в вашем приложении для временного запуска. Когда вы находитесь в режиме прерывания, все потоки в вашем приложении обычно останавливаются. Разрешение временно запускать другие потоки может неожиданно повлиять на состояние вашей программы и заставить отладчик игнорировать такие события, как точки останова.
Я все еще хотел бы лучшего объяснения, если кто-нибудь может дать это. Вопросы, на которые он не отвечает, включают: Какого рода оценка требует выполнения всех потоков? Как отладчик идентифицирует такой случай? Что именно происходит при нажатии значка обновления темы?
РЕДАКТИРОВАТЬ: Я думаю, что я наткнулся на ответ при рассмотрении Lazy<T>
под ILSpy (по совершенно другой причине). Получатель свойства Value
имеет вызов Debugger.NotifyOfCrossThreadDependency()
. У MSDN есть это, чтобы сказать:
[...] выполнение оценки функции обычно требует замораживания всех потоков, за исключением потока, выполняющего оценку. Если оценка функции требует выполнения в более чем одном потоке, как это может произойти в сценариях удаленного взаимодействия, оценка будет заблокирована. Уведомление NotifyOfCrossThreadDependency информирует отладчик о том, что он должен освободить поток или прервать оценку функции.
Таким образом, в основном, чтобы предотвратить досадный случай, когда вы пытаетесь оценить какое-то выражение, а Visual Studio просто зависает в течение 30 секунд, а затем сообщает вам, что «оценка функции истекла», код имеет возможность сообщить отладчику, что он должен разморозить другие потоки для успешной оценки, иначе оценка будет заблокирована навсегда.
Поскольку запуск других потоков может нарушить ваш сеанс отладки, как обычно, когда вы оцениваете выражение, все остальные потоки остаются замороженными, отладчик не продолжает автоматически и предупреждает вас, прежде чем позволить вам спрыгнуть с кроличьей норы.