在线程内打开窗口

时间:2012-07-19 10:21:21

标签: c# wpf multithreading threadpool task-parallel-library

我需要一些帮助来解决这个问题。

情景:

  1. 启动3个线程(每个线程具有不同的值)(使用TPL或使用ThreadPool)
  2. 每个线程收集一些不同的数据
  3. 打开foreach线程一个Window,其中包含来自线程的特定数据
  4. 用户在每个窗口中输入一些值
  5. 将值发送回特定主题
  6. 一些额外的工作
  7. 完成
  8. 现在,问题是,我无法在线程中打开一个窗口,因为它必须是一个GUI-Thread(ApartmentState.STA)。

    知道如何处理窗口/用户输入的问题吗?

2 个答案:

答案 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()和模态表单可以解决用户忙于填写新表单的问题。也许你可以试试吗?