Пользовательский замораживающий графический интерфейс tracelistener в приложении WPF

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

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

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

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

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

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


person Sait    schedule 25.05.2011    source источник
comment
включите перехват всех выброшенных исключений и посмотрите, что произойдет.   -  person Yaur    schedule 25.05.2011


Ответы (1)


person    schedule
comment
Простите меня за то, что я новичок в такого рода вещах, но как я могу получить стеки вызовов для различных потоков. Пройдясь по коду, я обнаружил, что рабочий поток не блокируется и нормально проходит вызов Trace.WriteLine. Это просто поток графического интерфейса, который блокируется. - person Sait; 26.05.2011
comment
Ваш ответ определенно указал мне правильное направление. Похоже, что состояние гонки было связано с тем, что поток пользовательского интерфейса выполнял начальное перечисление в наблюдаемой коллекции, в то время как другие потоки модифицировали его. Правильным решением, вероятно, было бы переписать наблюдаемую коллекцию, чтобы сделать ее действительно потокобезопасной, однако я не уверен, что смогу сделать это без полной ее повторной реализации. Непосредственная проблема была решена путем создания метода AppSetupCompleted для фоновых задач. Затем я вызываю begininvoke с фоновым приоритетом и создаю поток для его запуска. - person Sait; 26.05.2011