我需要一些帮助来解决这个问题。
情景:
现在,问题是,我无法在线程中打开一个窗口,因为它必须是一个GUI-Thread(ApartmentState.STA)。
知道如何处理窗口/用户输入的问题吗?
答案 0 :(得分:2)
http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/
说明如何为每个窗口设置单独的UI线程。
private void OnCreateNewWindow( object sender, RoutedEventArgs e)
{
Thread thread = new Thread(() =>
{
Window1 w = new Window1();
w.Show();
w.Closed += (sender2, e2) =>
w.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
答案 1 :(得分:0)
我通常做的是让每个线程收集其数据,BeginInvoke本身到GUI线程,然后等待AutoResetEvent / Semaphore。 GUI线程获取消息并显示表单/来自线程实例的数据。通常的组件回调(在GUI线程上下文中)使用来自用户/其他的附加数据加载线程成员,然后可能在关闭用户输入表单或单击OK按钮时发出事件/ sema信号。然后运行工作线程并加载其他用户数据。
您不必使用BeginInvoke线程对象 - 如果需要,您可以发布一些其他'ThreadComms'对象,它只包含成员数据和要发信号的事件。
这基本上是一个可以解决问题的解决方案,毫无疑问是其他人。如果你有三个线程,它有时会有点混乱,因为任何时候都可能弹出三个用户输入表单,(恼人的是,当用户填写了一半时,弹出了来自thread / s 2/3的新表单)来自线程1)的表格。
你可以只调用Invoke(),但如果可以的话,我会尝试避免直接的,同步的线程间通信。 Invoke()和模态表单可以解决用户忙于填写新表单的问题。也许你可以试试吗?