Переопределить приложение.Doevents () в C #, чтобы он был отключен в режиме отладки

#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.