В своей ленте слова я запускаю WPF-Wizard по нажатию кнопки, чтобы пользователь мог сгенерировать документ.
Я хочу, чтобы загрузка данных, необходимых мастеру, и инициализация самого мастеравыполняется в дополнительном потоке, чтобы время загрузки слова или надстройки не зависело от времени загрузки.
Я пытался добиться этого с помощью простого потока.
System.Threading.Thread initWizard =
new System.Threading.Thread(() => InitializingDatbaseLoad());
initWizard.SetApartmentState(System.Threading.ApartmentState.STA);
initWizard.Start();
В методе InitializingDatbaseLoad () в потоке я создаю экземпляр мастера WPF и предоставляю данные, загруженные из базы данных:
_wizardForm = new Wizard(_customerController.GetAllCustomers(), _configurationController.GetAllConfigurations());
Мастер представляет собой простую программу WPF:
public partial class Wizard : Window
{
public Wizard(ICollection<ICustomer> customers, ICollection<IConfiguration> configurations)
{
InitializeComponent();
InitializeDataTables(customers, configurations);
}
Теперь, когда все, что загружено и инициализировано, и я хочу показать WPF, я получаю: System.InvalidOperationException: 'Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им.'
Поиск здесь исключения показывает, что диспетчер должен использоваться, если элементы пользовательского интерфейса заменены на потоки, отличные от основного потока.
И есть моя проблема.Является ли основной поток «фоновым» потоком, который я использовал для инициализации формы?Нужно ли использовать этот поток для работы с мастером WPF?Такое чувство, что я что-то делаю неправильно.