多个UI线程 – Winforms

我想在我的应用程序中创建多个UI线程。 我已经模拟了如下方案。 我在后台线程中单击按钮创建一个新窗口/表单

namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var thread = new Thread(() => { Form f = new Form(); Application.Run(f); }); // thread.IsBackground = true; -- Not required. See Solution below thread.SetApartmentState(ApartmentState.STA); thread.Start(); } } } 

请注意 – 我正在做IsBackground = true因为当用户在主窗体上关闭时,子窗体/窗口也应该关闭。 是否有更清洁/优雅的方式来实现同样的目标?

编辑 – 我想为每个窗口创建专用的UI线程。 我将有10个这样的窗口并行显示实时数据。

解决方案 – 这样好吗? (根据msdn和Hans在下面评论)设置了公寓状态(见上面的代码)

 protected override void OnClosed(EventArgs e) { Application.Exit(); } 

弄乱线程只会迟早咬你。

来自MSDN:

Windows窗体中的控件绑定到特定线程,并且不是线程安全的。 因此,如果从另一个线程调用控件的方法,则必须使用控件的一个调用方法来调用正确的线程调用

您当然可以根据需要使用尽可能多的线程,但不要尝试创建一个解决方法,以便能够使用不同的线程来更新UI。 请InvokeRequired您的工作者/后台线程中的Invoke / InvokeRequired

使用扩展方法使其更清晰: 自动化InvokeRequired代码模式

我认为你需要将你的线程的单元状态设置为单线程,如此处所示的ApartmentState for t.SetApartmentState(ApartmentState.STA) ,这里是Thread-safe Form.Show:t.SetApartmentState(ApartmentState.STA t.SetApartmentState(ApartmentState.STA) 。 我不知道这是否可能在后台线程上。

我要求你看的另一件事是MDI(多文档界面,例如这里 )。 您真的需要将不同的表单显示为自己的窗口,还是将它们放在常见表单中? 您当然可能有创建多个UI线程的原因。

您可以处理MainForm.Closing事件并为每个子表单调用subForm.Close(编组到右侧线程)。

不过,我不确定你为什么要在单独的线程上使用这些表单。 你不能只在主线程上非模态地显示子表单吗?