Подтвердить что ты не робот

WPF визуализирует зависание резьбы

У меня возникла проблема в приложении wpf, где поток рендеринга останавливает рендеринг, но поток нитей и вспомогательные потоки по-прежнему накапливают сообщения.

Похоже, что это связано с повреждением кеша представления, но это маловероятно, так как приложение восстанавливается при перезагрузке.

Времена рендеринга иногда зависают, предотвращая обновление чертежей, но поток пользовательского интерфейса все еще накачивает сообщения.

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

Каков наилучший способ диагностики основной причины этой проблемы?

У меня есть ошибка с microsoft в connect, но она не будет считаться, если другие не проголосуют за нее.

4b9b3361

Ответ 1

Замораживание было вызвано размещенным видеообъявлением управления ActiveX.

Было состояние гонки в том, как элемент управления использовал directshow, из-за которого directx зависал.

Мы обнаружили эту проблему, взяв дамп процесса с помощью procdump, а затем открыв файл дампа в окнах .

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

Это позволило нам создать повторяемую зависание, используя код, который запустил и остановил видео. Мы удалили элементы управления, и зависание остановилось.

Ответ 2

Я не знаю, почему это происходит, но я испытал это раньше. Легче это наблюдать в системах, нацеленных на платформу 4.0, и работать на старых компьютерах (XP, Vista).

Я решил решить следующее:

  • Удалить FontCache3.0.0.0.dat
  • Постоянно отключить службу кеша шрифтов на компьютере-нарушителе

Решение 1 работало на одной машине XP. Он также работал на машине Vista, но через некоторое время проблема снова появилась.

Чтобы удалить FontCache3.0.0.0.dat, перед удалением этого файла вам нужно будет остановить службу "Шрифтовый кэш 3.0.0.0". В Vista он находится в каталоге c:\windows\serviceprofiles\localservice\appdata\local. В XP это находится в папке c:\windows\system32\documents и settings\localservice\local settings\application data (возможно, я ошибался в некоторой папке)

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

Ответ 3

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

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

Можете ли вы получить его для повторного использования в простом приложении, которое выполняет только рендеринг и связанные с ним части остальной части приложения, или это происходит только (возможно только?) в полной программе?

Ответ 4

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

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

Ответ 5

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