WPF очень строго (по сравнению с формами Windows) требует, чтобы методы, которые обновляли элементы пользовательского интерфейса, выполнялись в основном потоке / пользовательском интерфейсе.Таким образом, вы определенно хотите, чтобы оба окна были в основном потоке пользовательского интерфейса.Ошибка, которую вы видите, это то, что происходит, если вы пытаетесь выполнить работу с пользовательским интерфейсом в WPF из другого потока, поэтому вам абсолютно необходимо прекратить это делать.Можно открыть несколько окон, все в одном потоке пользовательского интерфейса.
Если одно из ваших окон выполняет тяжеловесную обработку, которая блокирует пользовательский интерфейс, то проще всего, вероятно, добавить ключевое слово async к вашему.событие нажатия кнопки и поместите работу, которую вы делаете, в другой метод, который имеет ключевое слово async.Затем, когда вы вызываете вспомогательный метод, вы используете ключевое слово await.
Я согласен с другими, что BackgroundWorker и Task - это два других способа выполнения тяжеловесной обработки в фоновом потоке, при этом все еще имея отзывчивый пользовательский интерфейс.Задачи проще в использовании, чем BackgroundWorker.
Если вы используете BackgroundWorker, может быть достаточно использовать событие RunWorkerCompleted.Если это так, посмотрите на этот пост: Как использовать WPF Background Worker .Если вы используете BackgroundWorker и вам нужно вызвать пользовательский метод в своем классе пользовательского интерфейса из фонового потока, то передайте объект Dispatcher для вашего окна / диалога в фоновый поток (или получите доступ к нему другим способом), и когдаон должен перезвонить в пользовательский интерфейс, использовать Invoke с объектом Dispatcher.Используя Invoke, метод, который вы вызываете из фонового потока, будет выполняться в потоке пользовательского интерфейса.