У меня многопоточная сборка приложений на C # с использованием VS2010 Professional.Это довольно большое приложение, и мы уже сталкивались с проблемами многопоточности и взаимоблокировок в графическом интерфейсе пользователя, но в прошлом месяце мы заметили, что кажется, что блокировка появляется, когда она простаивает около 20-30 минут.
Приложение не отвечает, и хотя оно будет перекрашиваться, когда другие окна перетаскиваются перед приложением и поверх него, графический интерфейс пользователя по-прежнему кажется заблокированным ... в некотором смысле (в отличие от потока GUI, используемого в течение значительного количества времени.время) кнопки «Закрыть», «Развернуть» и «Свернуть» также не реагируют, и при нажатии небольшой (не отвечает ...) текст не отображается в заголовке приложения, т. е. Windows по-прежнему считает, что работает нормально.
Если я ломаю / приостанавливаю приложение, используя отладчик, и просматриваю запущенные потоки.Есть 3 потока нашего управляемого кода, которые выполняются, и несколько других рабочих потоков, для которых не может быть отображен исходный код.
3 потока, которые выполняются:
- main / GUI thread
- Поток с бесконечным циклом
- Поток с бесконечным циклом
Если я перейду к потокам 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