2012-07-19 62 views
0

我需要一些帮助,我可以如何管理这个问题。打开一个线程内的窗口

场景:

  1. 开始3个线程(每个具有不同的值)(与TPL或线程池)
  2. 每个线程收集一些不同的数据
  3. 打开的foreach线程一个窗口,与特定的从螺纹
  4. 用户数据进入在每个窗口中的某个值
  5. Value被发送回特定线程
  6. 一些额外的工作
  7. 成品

现在的问题是,我不能打开一个窗口,一个线程内,因为它是一个GUI线程(ApartmentState.STA)。

任何想法如何我可以处理窗口/用户输入的问题?

+3

你不应该让线程等待用户输入。这是这个问题的根源。 – 2012-07-19 10:30:44

+0

这对我来说没有意义。你为什么要同时打开三个窗口?用户将无法同时使用它们全部。 – svick 2012-07-19 12:08:12

+0

“现在,问题是,我无法打开一个窗口里面的一个线程”打开一个窗口已经是一个线程:) – 2012-07-19 12:17:19

回答

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(); 
} 
0

我最常做的是让每个线程收集其数据的BeginInvoke本身的GUI线程,然后等待上的AutoResetEvent /信号灯。 GUI线程获取消息并显示窗体/任何与线程实例的数据。通常的组件回调(在GUI线程上下文中)使用来自用户/任何其他数据的线程成员加载线程成员,然后当用户输入表单关闭或点击OK按钮时,通知事件/ sema。工作线程随后运行,并加载其他用户数据。

您不必BeginInvoke线程对象 - 如果需要,您可以发布其他一些“ThreadComms”对象,该对象仅包含成员数据,并且该事件发信号。

这基本上是一个解决方案,将cetainly工作,毫无疑问其他人。如果你有三个线程,它有时可能会有点混乱,因为随时可能弹出三个用户输入表单(令人烦恼的是,当用户填满时,弹出2/3线程的新表单来自线程1的表单)。

你可以只是Invoke(),但我尽量避免直接的,同步的线程间通信。 Invoke()和模式表单可以解决用户忙于填充新表单的问题。也许你可以尝试一下吗?