"Вызывающий поток должен быть 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 вещи:
- слишком много способов использовать Dispatcher как Dispatcher_Operation , [окно.dispatcher] или etc.
- мы должны
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