1

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

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

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

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

  1. Основной/графический поток
  2. Поток, который петли неопределенно долго
  3. нить, что петли неопределенно долго

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

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

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

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

РОО

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

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

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

http://timl.net/

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

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

Это определило контроль я ПОСТРОЕНИЕ от графического интерфейса пользователя нитки.Однако я знал это и правильно собирал звонки, но я не понимал, что за кулисами этот элемент управления подписывается на событие или набор событий, которые запускаются, когда, например, сеанс Windows разблокирован или выйдет заставка. Эти вызовы всегда выполняются в потоке основного/пользовательского интерфейса и блокируются, когда он видит, что вызов был сделан на неправильном потоке. Ким объясняет более подробно здесь ...

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

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

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

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

Его

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

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

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

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

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

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

Его

+0

Вы проверили использование своей памяти? Может быть, это не совсем затормозило, просто заменив диск ... – Grzenio

+0

@Grzenio: Нет; то он не ответил бы вообще. – SLaks

+4

Что такое callstack внутри 'Application.Run'? (Отключить только мой код) – SLaks

ответ

3

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

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

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

+0

Спасибо за быстрое предложение! Я сделаю это. – Roo

+0

Фактически, я фактически удаляю и повторно применяю обработчик событий во время выполнения. Это плохая практика? – Roo

+1

@ Roo: Нет, это не так. Вам просто нужно знать о многопоточных последствиях. Если вы добавите обработчик и поднимите событие на разные потоки, используйте отдельную переменную для нулевой проверки рейзера. – SLaks

4

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

+0

Спасибо Dan! Еще одно замечательное предложение, я посмотрю. – Roo

+0

В этом случае форма будет звучать, когда вы нажмете на нее. – SLaks

+2

@SLaks, предполагая, что система имеет звук, что не подходит для многих машин для клиентов. Я столкнулся с этой конкретной проблемой раньше и теперь стараюсь всегда устанавливать Владельца любого окна, которое я планирую показать модально. –

Смежные вопросы