VS2012 - Почему мой основной поток пользовательского интерфейса показывает зеленые отладочные заявления?

Изменить. Если вы видите эту проблему (и вы привыкли НЕ видеть это под VS2010), прокомментируйте это ниже, поэтому я знаю это не только я, но обязательно проверьте Han ответьте, чтобы убедиться, что ни один из этих сценариев не появился...


Я обновляю свое приложение для работы с .NET 4.5 в RTM VS2012 и замечаю то, что я не совсем понимаю, и это неожиданно зеленые подсвеченные заявления (вместо желтого).

enter image description here

Теперь я хорошо знаю, что это должно означать, и среда IDE даже показывает мне небольшую подсказку для объяснения.

Это следующий оператор для выполнения, когда этот поток возвращается из текущая функция

Однако нет абсолютно ничего асинхронного или потока, основанного на этом коде. В этом простом примере я уверен, что вы согласитесь, что string.ToUpper() не будет отключен в другом потоке. Я могу пройти через код без проблем.

Там ничего не происходит, и я нахожусь в основном потоке, как вы можете видеть здесь.

s

I am, используя async и await и MVVM-Light (приведенный выше метод является результатом RelayCommand), но я все еще получаю это поведение, даже когда путь кода находится прямо обработчик событий, например PreviewKeyDown.

enter image description here

Если я создаю новое приложение, я не могу его дублировать - окраска будет желтой, как ожидалось, даже при использовании await.

У кого-нибудь есть идея? Это начинает сводить меня с ума!

Ответ 1

Он зеленый, если текущий указатель инструкции не находится точно в начале инструкции. Некоторые распространенные причины:

  • Общие в потоковом коде, устанавливая точку останова в одном потоке и переключая контекст на другой. Другой поток будет прерван отладчиком в совершенно случайном месте. Часто в коде, в котором у вас нет исходного кода или информации для отладки, например String.ToUpper(), отладчик может отображать только "ближайший" исходный код
  • Использование Debugger + Break All для входа в отладчик. Та же идея, что и выше, указатель инструкции будет на случайном адресе
  • Получение исключения в коде, для которого вы не имеете отладочной информации. Редактор показывает последнюю запись в стеке вызовов, для которой он имеет исходный код. Вам нужно окно стека вызовов, чтобы увидеть, где было создано реальное исключение. Или Ассистент исключения, его причина быть
  • Отладка оптимизированного кода. Оптимизатор джиттера сильно искажает код, что делает вероятным, что отладчик не может точно показать текущее местоположение.
  • Наличие устаревшей информации об отладке или редактирование кода при отладке
  • Отладочный код, сгенерированный джиттером x64, происходит, когда настройка целевой целевой платформы - AnyCPU. У джиттера x64 есть ряд хронических ошибок, которые не исправляются, и некорректная информация об отладке является одним из них. Проблемы, которые не были решены до тех пор, пока они не были полностью переписаны, выполнены проектом RyuJIT и впервые доступны в версии .NET 4.6. Таргетинг x86 в вашем проекте EXE является обходным путем.

Ответ 2

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