Полностью переписал вопрос, так как теперь у меня больше информации о том, что происходит.
У меня есть customtracelistener, который переопределяет метод writeline для добавления строк в пользовательскую наблюдаемую коллекцию. Этот класс коллекции отправляет все события уведомлений в поток пользовательского интерфейса, чтобы позволить другим потокам обновлять его и по-прежнему разрешать привязку данных WPF.
У меня есть пользовательский элемент управления, который включает в себя список. Список привязывает наблюдаемую коллекцию в прослушивателе трассировки к ее источнику элементов.
При запуске моего приложения я устанавливаю windows/usercontrols/viewmodels и показываю окно. Затем я запускаю рабочий поток, который запускает некоторые серверные процессы, необходимые для приложения. Если фоновые потоки выполняют Trace.WriteLine до того, как поток пользовательского интерфейса завершит всю настройку пользовательского элемента управления и привязку данных, мое приложение блокируется.
Я смог несколько разумно доказать это состояние гонки, добавив спящие и другие случайные длительные задачи в поток пользовательского интерфейса и/или задержав запуск рабочего потока, чтобы дать потоку пользовательского интерфейса время для завершения.
Решение, которое я думаю реализовать сейчас, заключается в создании метода AppSetupCompleted
, который запускает рабочие потоки для всех серверных процессов и отправляет его в Dispatcher с фоновым приоритетом. Теоретически должно ли это задерживать рабочие потоки до тех пор, пока все привязки для элементов управления WPF и моделей представления не будут успешно настроены?