“Вызывающим потоком должен быть STA, потому что много компонентов UI требуют этой” ошибки при создании всплывающего окна WPF в потоке

У меня есть приложение WPF, в которое поток проверяет некоторое значение. В определенных случаях я показываю всплывающее окно Window для отображения сообщения. Когда я создаю это всплывающее окно в потоке, исключение выдается конструктором всплывающего окна:

"Вызывающим потоком должен быть STA, потому что много компонентов UI требуют этого".

Как я разрешаю эту ошибку?

Это - мой код для создания всплывающего окна:

// using System.Threading;
// using System.Windows.Threading;
Thread Messagethread = new Thread(new ThreadStart(delegate()
{
    DispatcherOperation DispacherOP = 
        frmMassenger.Dispatcher.BeginInvoke(
            DispatcherPriority.Normal,
            new Action(delegate()
            {
                frmMassenger.Show();
            }));
}));
Messagethread.Start();
14
задан stakx supports GoFundMonica 20 August 2013 в 07:46
поделиться

2 ответа

Абсолютно Диспетчер - это единственный способ сделать что-то (в конкретном потоке), когда мы работаем с многопоточностью в WPF!

Но для работы с Диспетчером мы должны знать 2 вещи:

  1. Слишком много способов использования диспетчера, например Dispatcher_Operation , [window.dispatcher] или т.д.
  2. Мы должны вызывать диспетчер в основном потоке приложения (этот поток должен быть STA потоком)

Например: если мы хотим показать другое окно[wpf] в другом потоке, мы можем использовать этот код:

Frmexample frmexample = new Frmexample();
            Frmexample .Dispatcher.BeginInvoke
                (System.Windows.Threading.DispatcherPriority.Normal,
                (Action)(() =>
                {
                    frmexample.Show();
                    //---or do any thing you want with that form
                }
                ));

Совет: Помните - мы не можем получить доступ к любым полям или свойствам из диспетчера, поэтому используйте это с умом

9
ответ дан 1 December 2019 в 12:26
поделиться

Для потока, в котором вы пытаетесь запустить элемент GUI, вам необходимо установить состояние квартиры потока на STA BEFORE вы его запускаете.

Пример:

myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
14
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: