我需要一些帮助如何解决这个问题。
设想:
- 启动 3 个线程(每个线程具有不同的值)(使用 TPL 或使用 ThreadPool)
- 每个线程收集一些不同的数据
- 为每个线程打开一个窗口,其中包含来自线程的特定数据
- 用户在每个窗口中输入一些值
- 值被发送回特定线程
- 一些额外的工作
- 完成的
现在,问题是,我无法在线程内打开窗口,因为它必须是 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/Semaphore。GUI线程获取消息并显示表单/来自线程实例的数据。通常的组件回调(在 GUI 线程上下文中)使用来自用户/其他的附加数据加载线程成员,然后可能当关闭用户输入表单或单击 OK 按钮时,发出事件/sema 信号。然后,工作线程继续运行,并加载了附加的用户数据。
您不必 BeginInvoke 线程对象 - 如果需要,您可以发布其他一些“ThreadComms”对象,它仅包含成员数据和要发出信号的事件。
这基本上是一种可行的解决方案,毫无疑问还有其他解决方案。如果您有三个线程,有时可能会有点混乱,因为可能随时弹出三个用户输入表单,(令人讨厌的是,当用户填写一半时,会弹出来自 thread/s 2/3 的新表单来自线程 1) 的表单。
你可以只调用 Invoke(),但如果可以的话,我会尽量避免直接、同步的线程间通信。Invoke() 和模态表单可以解决用户忙于填写时弹出新表单的问题。也许您可以尝试一下?