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

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

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

Как устранить эту ошибку?

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

// 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();

2 ответов


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

пример:

myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();

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

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

  1. слишком много способов использовать Dispatcher как Dispatcher_Operation , [окно.dispatcher] или etc.
  2. мы должны call dispatcher in the main thread of app (этот поток должен быть потоком 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
                }
                ));

Совет: Remember - we can't access any fields or properties from out dispatcher, so use that wisely