0

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

设想:

  1. 启动 3 个线程(每个线程具有不同的值)(使用 TPL 或使用 ThreadPool)
  2. 每个线程收集一些不同的数据
  3. 为每个线程打开一个窗口,其中包含来自线程的特定数据
  4. 用户在每个窗口中输入一些值
  5. 值被发送回特定线程
  6. 一些额外的工作
  7. 完成的

现在,问题是,我无法在线程内打开窗口,因为它必须是 GUI 线程(ApartmentState.STA)。

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

4

2 回答 2

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();
}
于 2012-07-19T10:35:35.917 回答
0

我通常做的是让每个线程收集它的数据,BeginInvoke 自身到 GUI 线程,然后等待 AutoResetEvent/Semaphore。GUI线程获取消息并显示表单/来自线程实例的数据。通常的组件回调(在 GUI 线程上下文中)使用来自用户/其他的附加数据加载线程成员,然后可能当关闭用户输入表单或单击 OK 按钮时,发出事件/sema 信号。然后,工作线程继续运行,并加载了附加的用户数据。

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

这基本上是一种可行的解决方案,毫无疑问还有其他解决方案。如果您有三个线程,有时可能会有点混乱,因为可能随时弹出三个用户输入表单,(令人讨厌的是,当用户填写一半时,会弹出来自 thread/s 2/3 的新表单来自线程 1) 的表单。

你可以只调用 Invoke(),但如果可以的话,我会尽量避免直接、同步的线程间通信。Invoke() 和模态表单可以解决用户忙于填写时弹出新表单的问题。也许您可以尝试一下?

于 2012-07-19T12:13:39.613 回答