У меня есть приложение 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();
Абсолютно Диспетчер
- это единственный способ сделать что-то (в конкретном потоке), когда мы работаем с многопоточностью в WPF!
Но для работы с Диспетчером мы должны знать 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
}
));
Совет: Помните - мы не можем получить доступ к любым полям или свойствам из диспетчера, поэтому используйте это с умом
Для потока, в котором вы пытаетесь запустить элемент GUI, вам необходимо установить состояние квартиры потока на STA BEFORE вы его запускаете.
Пример:
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();