Пользовательский графический интерфейс замораживания tracelistener в приложении WPF - PullRequest
0 голосов
/ 25 мая 2011

Полностью переписал вопрос, так как теперь у меня есть больше информации о том, что происходит.

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

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

При запуске приложения я настраиваю windows / usercontrols / viewmodels и показываю окно. Затем я запускаю рабочий поток, который запускает некоторые внутренние процессы, необходимые для приложения. Если фоновые потоки выполняют Trace.WriteLine до того, как поток пользовательского интерфейса завершит все настройки пользовательского элемента управления и привязку данных, мои приложения будут заблокированы.

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

Решение, которое я сейчас собираюсь реализовать, заключается в создании метода AppSetupCompleted, который запускает рабочие потоки для всех внутренних процессов и отправляет его в Dispatcher с приоритетом фона. Теоретически, должно ли это задерживать рабочие потоки до тех пор, пока все привязки для элементов управления WPF и моделей представления не будут успешно установлены?

1 Ответ

0 голосов
/ 25 мая 2011

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

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

...