Я разрабатываю приложение, которое должно получать команды через интерфейс сокетов, а затем выполнять их в графическом интерфейсе.Это приложение разрабатывается на C # .NET 4.0 и использует WPF для своего графического интерфейса.
Интерфейс сокета имеет рабочий поток, который продолжает прослушивать сокет и обрабатывать его команды, так что если, например, команда Show PopupПолучено, рабочий поток вызывает класс менеджера, который отвечает за создание всплывающего окна и показывает его на главном экране.
Метод менеджера, который создает всплывающее окно и затем вызывает главный экран, выглядит следующим образом:
public void ProcessPopup(PopupModel model)
{
switch (model.ScreenType)
{
case Screens.Type1:
popup = new PopupType1();
break;
case Screens.Type2:
popup = new PopupType2();
break;
case Screens.Type3:
popup = new PopupType3();
break;
case Screens.Type4:
popup = new PopupType4();
break;
}
viewModel.SetModel(model);
if (!Dispatcher.CurrentDispatcher.Equals(App.Current.Dispatcher))
{
App.Current.Dispatcher.Invoke((ThreadStart)delegate { mainScreen.ShowPopup(popup); });
}
else
{
mainScreen.ShowPopup(popup);
}
}
Класс PopupType1:
public partial class PopupType1 : UserControl
{
public PopupType1 ()
{
InitializeComponent();
}
}
Проблема заключается в том, что при создании нового объекта PopupType1 я получаю следующее исключение:
System.InvalidOperationException: The calling thread must be STA, because many UI components require this.
at System.Windows.Input.InputManager..ctor()
at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
at System.Windows.Input.InputManager.get_Current()
at System.Windows.Input.KeyboardNavigation..ctor()
at System.Windows.FrameworkElement.FrameworkServices..ctor()
at System.Windows.FrameworkElement.EnsureFrameworkServices()
at System.Windows.FrameworkElement..ctor()
at System.Windows.Controls.Control..ctor()
at System.Windows.Controls.UserControl..ctor()
at MyApp.Views.PopupType1..ctor()
at MyApp.Manager.ProcessPopup(PopupModel model)
at MyApp.CommunicationController.ProcessAsync(XDocument messageXml)
У меня естьуже пробовал несколько вещей, таких как преобразование моего рабочего потока в поток STA или создание нового потока STA просто для обработки Popup, но они вызывали больше проблем, чем решали.
Наконец, важно упомянутьчто я делаю это, потому что мое приложение испытывает несколько "зависаний" во время своей работы, и яПолагаю, что они связаны с тем, что поток GUI WPF слишком перегружен задачами, чтобы быть должным образом реагирующим, поэтому я пытаюсь отделить обработку без GUI от потока GUI.