C # Word Ribbon - инициализация WPF в фоновом потоке - PullRequest
0 голосов
/ 20 января 2019

В своей ленте слова я запускаю 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?Такое чувство, что я что-то делаю неправильно.

...