Еще один вопрос отладки тупика в C # - PullRequest
1 голос
/ 19 августа 2010

У меня многопоточная сборка приложений на C # с использованием VS2010 Professional.Это довольно большое приложение, и мы уже сталкивались с проблемами многопоточности и взаимоблокировок в графическом интерфейсе пользователя, но в прошлом месяце мы заметили, что кажется, что блокировка появляется, когда она простаивает около 20-30 минут.

Приложение не отвечает, и хотя оно будет перекрашиваться, когда другие окна перетаскиваются перед приложением и поверх него, графический интерфейс пользователя по-прежнему кажется заблокированным ... в некотором смысле (в отличие от потока GUI, используемого в течение значительного количества времени.время) кнопки «Закрыть», «Развернуть» и «Свернуть» также не реагируют, и при нажатии небольшой (не отвечает ...) текст не отображается в заголовке приложения, т. е. Windows по-прежнему считает, что работает нормально.

Если я ломаю / приостанавливаю приложение, используя отладчик, и просматриваю запущенные потоки.Есть 3 потока нашего управляемого кода, которые выполняются, и несколько других рабочих потоков, для которых не может быть отображен исходный код.

3 потока, которые выполняются:

  1. main / GUI thread
  2. Поток с бесконечным циклом
  3. Поток с бесконечным циклом

Если я перейду к потокам 2 и 3, они будут выглядеть правильно,Они не разделяют блокировки (даже с основным потоком GUI) и вообще не используют поток GUI.Однако при входе в основной поток / GUI он прерывается на Application.Run ...

Эта проблема вызывает у меня тупик, но я не понимаю, что если он тупик, почему я не вижустрока кода, на которой висит основная ветка / GUI?

Любая помощь будет принята с благодарностью!Дайте мне знать, если вам нужна дополнительная информация ...

Приветствия,

Roo

-----------------------------------------------------РЕШЕНИЕ--------------------------------------------------

Хорошо,так что проблема сейчас решена.Спасибо всем за их предложения!Очень признателен!Я пометил ответ, который решил мою первоначальную проблему определения, где в главном / пользовательском интерфейсе висит приложение (я не выключил опцию «Включить только мой код»).

Общая проблема, которую яиспытывал действительно тупик, однако.Получив стек вызовов и вставив верхнюю половину его в Google, я наткнулся на это, которое точно объясняет, что я испытывал ...

http://timl.net/

Это ссылка на прекрасное руководство поотладка проблемы ...

http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/

Это идентифицировало элемент управления, который я создавал из потока GUI.Однако я знал это и правильно распределял вызовы, но я не понимал, что за кулисами этот элемент управления подписывался на событие или набор событий, которые запускаются, например, когда сеанс Windows разблокирован или экранная заставка завершается.,Эти вызовы всегда выполняются в основном потоке / пользовательском интерфейсе и блокируются, когда он обнаружил, что вызов был выполнен в неверном потоке.Ким более подробно объясняет здесь ...

http://krgreenlee.blogspot.com/2007/09/onuserpreferencechanged-hang.html

В конце концов я нашел альтернативное решение, которое не требовало этого элемента управления из основного потока / потока пользовательского интерфейса.

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

Еще раз спасибо всем, кто помог!(и косвенно, восхитительные блоггеры, на которых я ссылался выше!)

Roo

----------------------------------------------------- РЕШЕНИЕ II --------------------------------------------------

Нет проблем с потоками... вы думаете, что решили это, и через месяц он снова появляется.Я все еще верю, что решение, приведенное выше, решило проблему, которая могла бы вызвать аналогичное поведение, но мы столкнулись с проблемой снова.

Поскольку мы потратили некоторое время на отладку, я решил обновить этот вопрос нашим (надеюсь) окончательным решением:

Похоже, проблема заключалась в ошибке в компонентах Infragistics в выпуске WinForms 2010.1 (без исправлений). Мы работали примерно с момента появления проблемы с замораживанием (но также добавили кучу других вещей). После обновления до WinForms 2010.3 нам еще предстоит воспроизвести проблему (deja vu). Смотрите мой вопрос здесь для получения дополнительной информации: ' .NET 4.0 и страшный OnUserPreferenceChanged Hang '. Ганс дал хороший обзор общей проблемы.

Я надеюсь, что это немного добавляет к предложениям / информации, касающейся питательного OnUserPreferenceChanged Hang (или как вы хотите это называть).

Приветствия

Roo

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

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

3 голосов
/ 19 августа 2010

Проверьте, где он висит Application.Run;отключите Just My Code в параметрах отладчика, затем посмотрите на стек вызовов.

Я исправил приложение, заблокированное в Application.Run, потому что оно пыталось удалить обработчик событий из объекта, которым был другой потокзаблокирован(До компилятора C # 4.0 обработчики событий неявно обращаются к lock(this))

Однако, если вы используете VS2010, это не совсем проблема.

...