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