Когда вы создаете объект WPF - Окно , UserControl или что-либо еще, что происходит от DispatcherObject - он блокируется в потоке, которым он был создано на. Таким образом, вы не можете загрузить окно в фоновом потоке, а затем перенести его в основной поток пользовательского интерфейса. Если вы собираетесь создать его в фоновом потоке, он должен оставаться в этом потоке; он должен быть показан этим потоком и иметь сообщение сообщений в этом потоке.
Но это жизнеспособно. Вы можете запустить фоновый поток, создать там свое окно, а затем подождать, пока основной поток скажет: «Хорошо, пришло время показать окно». Тогда ваш поток может вызвать Application.Run , чтобы запустить собственный насос сообщений и отключиться при закрытии окна.
Конечно, многопоточность открывает все виды новых осложнений. Возможно, вам нужен отдельный поток для каждого окна (пул потоков вряд ли будет работать для этого). Вы должны обрабатывать все межпоточные коммуникации. Если окна обращаются к каким-либо общим данным, вам необходимо защитить их с помощью какой-либо блокировки. Вы должны убедиться, что приложение закрывается, когда оно должно (и если это означает «когда все окна закрыты», то вам необходимо убедиться, что вы защищаете ресурс «количество открытых окон»). Возможно, есть и другие осложнения. Не входи в это легко.
Ваш лучший выбор, как уже говорили другие, - это профилировать ваш код и сначала попытаться решить проблемы с производительностью. Но если вы уверены, что проделали как можно больше работы с производительностью, многопоточность и фоновая загрузка могли бы стать хорошим вариантом для изучения.