我需要一些帮助,我可以如何管理这个问题。打开一个线程内的窗口
场景:
- 开始3个线程(每个具有不同的值)(与TPL或线程池)
- 每个线程收集一些不同的数据
- 打开的foreach线程一个窗口,与特定的从螺纹
- 用户数据进入在每个窗口中的某个值
- Value被发送回特定线程
- 一些额外的工作
- 成品
现在的问题是,我不能打开一个窗口,一个线程内,因为它是一个GUI线程(ApartmentState.STA)。
任何想法如何我可以处理窗口/用户输入的问题?
我需要一些帮助,我可以如何管理这个问题。打开一个线程内的窗口
场景:
现在的问题是,我不能打开一个窗口,一个线程内,因为它是一个GUI线程(ApartmentState.STA)。
任何想法如何我可以处理窗口/用户输入的问题?
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();
}
我最常做的是让每个线程收集其数据的BeginInvoke本身的GUI线程,然后等待上的AutoResetEvent /信号灯。 GUI线程获取消息并显示窗体/任何与线程实例的数据。通常的组件回调(在GUI线程上下文中)使用来自用户/任何其他数据的线程成员加载线程成员,然后当用户输入表单关闭或点击OK按钮时,通知事件/ sema。工作线程随后运行,并加载其他用户数据。
您不必BeginInvoke线程对象 - 如果需要,您可以发布其他一些“ThreadComms”对象,该对象仅包含成员数据,并且该事件发信号。
这基本上是一个解决方案,将cetainly工作,毫无疑问其他人。如果你有三个线程,它有时可能会有点混乱,因为随时可能弹出三个用户输入表单(令人烦恼的是,当用户填满时,弹出2/3线程的新表单来自线程1的表单)。
你可以只是Invoke(),但我尽量避免直接的,同步的线程间通信。 Invoke()和模式表单可以解决用户忙于填充新表单的问题。也许你可以尝试一下吗?
你不应该让线程等待用户输入。这是这个问题的根源。 – 2012-07-19 10:30:44
这对我来说没有意义。你为什么要同时打开三个窗口?用户将无法同时使用它们全部。 – svick 2012-07-19 12:08:12
“现在,问题是,我无法打开一个窗口里面的一个线程”打开一个窗口已经是一个线程:) – 2012-07-19 12:17:19