多个UI线程 - Winforms

Ang*_*wal 5 c# user-interface multithreading 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();
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

protected override void OnClosed(EventArgs e)
{
    Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)

jga*_*fin 5

弄乱线程迟早会咬你一口。

来自 MSDN:

Windows 窗体中的控件绑定到特定线程,并且不是线程安全的。因此,如果您从不同的线程调用控件的方法,则必须使用该控件的调用方法之一将调用编组到正确的线程

当然,您可以使用任意数量的线程,但不要尝试创建解决方法以便能够使用不同的线程来更新 UI。请改用 工作线程/后台线程中的Invoke/ 。InvokeRequired

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