#c# #debugging #remote-debugging #debug-symbols
#c# #отладка #удаленная отладка #debug-символы
Вопрос:
Я отлаживаю приложение, которое было перенесено из vb6. У него есть приложение.Doevents разбросаны повсюду, что нормально, за исключением случаев, когда я подключаюсь к отладчику. Как только я перехожу к приложению.Управление DoEvents () передается в некоторую случайную область, которая ожидается в зависимости от того, что находится на рассмотрении в перекачке сообщений. Как я могу элегантно переопределить этот метод в одном месте на уровне приложения, чтобы он работал следующим образом (псевдокод)
protected override void Application.Doevents()
{
if (!Debugger.IsAttached)
Application.Doevents()
}
не добавляя #ifdef для отладки повсюду.
Спасибо
Ответ №1:
Нет необходимости — или возможности — переопределять его.
Просто создайте статический класс со статическим методом в нем и поместите код, который вы хотите иметь внутри. Измените все вызовы на Application.DoEvents
на вызовы этого статического метода.
Комментарии:
1. спасибо вам и аналогичному ответу от Джона Скита. Сделаем согласно вашему совету.
Ответ №2:
Вы не можете переопределить его. Это статический метод. Однако вы могли бы легко написать свой собственный класс и заменить все текущие вызовы на Application.DoEvents
на CustomApplication.DoEvents
, например.
(Лично я не думаю, что это «нормально», когда приложение изначально загружается DoEvents
вызовами, но это другой вопрос.)
Комментарии:
1. Могу ли я также отметить ваш ответ как правильный? Не знаю, как пометить два ответа как правильные. Спасибо
Ответ №3:
У него есть приложение.Doevents разбросаны повсюду, что нормально, за исключением случаев, когда я подключаюсь к отладчику.
Нет, это не нормально. Не с подключенным отладчиком, не без подключенного отладчика. Предложенное вами решение является неправильным. Вам нужно полностью устранить ее, а не просто скрывать в режиме отладки, когда вы с наибольшей вероятностью заметите возникающие ошибки и побочные эффекты.
Выполните глобальный поиск и замену и закомментируйте каждую строку, где вызывается эта функция. Затем отладьте полученный код, чтобы выяснить, где он ломается и что вам нужно сделать, чтобы это исправить.
Подсказка: не выполняйте длительные или требующие больших затрат процессора задачи в потоке пользовательского интерфейса. Создайте для этого отдельный поток. BackgroundWorker
Компонент — чрезвычайно удобный способ сделать это, удобный даже для тех, кому пока неудобно работать с несколькими потоками.
Application.DoEvents
ошибка, ожидающая своего появления. Не позволяйте этому укусить вас. Разочаровывающее поведение, которое вы видите в отладчике, — это в точности то же самое, что происходит все время внутри кода вашего приложения. И что бы вы ни делали, не отправляйте код, содержащий вызовы, Application.DoEvents
которые вы не тщательно отладили.
Комментарии:
1. Это немного преувеличено.
DoEvents()
это (почти всегда) зло, но если вы наследуете кодовую базу с большим количеством вызовов, и она работает, оставьте ее в покое.2. @Henk — Я не думаю, что это вообще преувеличено. И что более важно, отключить его в режиме отладки, но оставить включенным в режиме выпуска — это явно неправильное решение. Это просто катастрофа, ожидающая своего часа, отправляющая подобный код, который не был тщательно отлажен. Есть только одно реальное решение этой проблемы.
3. @Cody: Отладка != Тестирование. И это рабочий код, поэтому капитальный ремонт для изменения наилучшей практики просто глуп.
4. Да ладно. OP наследует портированное приложение и, вероятно, должен немного исправить / расширить. Это хорошая причина для этого вопроса, а не для серьезного исправления того, что на самом деле не сломано.
5. Коди, согласен, что в идеальном мире с неограниченным временем для завершения проекта я бы поступил согласно твоему предложению. В будущем, когда у меня будет время, я все исправлю, но сейчас я просто хотел быстро исправить это. спасибо
Ответ №4:
Поместите определение переопределения в #ifdef DEBUG.