У одного из приложений нашей компании Windows Forms была странная проблема в течение нескольких месяцев.Приложение работало очень надежно для большинства наших клиентов, но на некоторых ПК (в основном с беспроводным сетевым подключением) приложение иногда просто не отвечало.(Вы нажимаете на пользовательский интерфейс, и окна просят вас подождать или убить приложение).
Я долго не мог отследить проблему, но теперь я выяснил, что произошло.Приложение содержало следующую строчку кода
// don't blame me for this. Wasn't my code :D
Control.CheckForIllegalCrossThreadCalls = false
и использовало некоторые фоновые потоки для изменения элементов управления.
Нет, я нашел способ воспроизвести ошибку остановки приложения на моем компьютере разработчика и отслеживалвплоть до строки, где я фактически использовал Invoke () для запуска задачи в главном потоке.
Me.Invoke(MyDelegate, arg1, arg2)
Очевидно, что где-то была блокировка потока.После удаления оператора
Control.CheckForIllegalCrossThreadCalls = false
и рефакторинга всей программы для использования Invoke () при изменении элемента управления из фонового потока проблема (надеюсь) исчезла.
Однако яинтересно, есть ли способ найти такие ошибки, не отлаживая каждую строку кода (даже если я перестал работать в отладчике после того, как приложение перестало отвечать, я не могу сказать, что произошло последним, потому что среда IDE не перепрыгнула на оператор Invoke ())
Другими словами:
Если мои приложения зависают, как я могу определить, какая строка кода выполнялась последней?
Может быть, даже наПК для клиентов.
Я знаю, что VS2010 предлагает некоторую функцию обратной отладки, возможно, это было бы решением, но в настоящее время я использую VS2008.