将Panel添加到不同线程上的窗体

本文关键字:线程 窗体 Panel 添加 | 更新日期: 2023-09-27 18:19:48

我有一个面板,其中包含一个用于显示相机流的活动x组件。这是外部代码。由于相机驱动程序的原因,该面板只能运行STA线程。

如何在另一个线程上创建的窗体上显示此面板?例如:

[STAThread]
        public Main()
        {
            Panel display = new Panel();
            Thread form = new Thread(()=>
            {
                Form displayForm = new Form();
                displayForm.Show();
                displayForm.Controls.Add(display);
            });
            form.Start();
            CameraComponent axCamera = new CameraComponent(); //create new camera component active x component
            display.Controls.Add(axCamera);
        }

但这引发了一个异常:display.Controls.Add(axCamera);异常:跨线程操作无效:从创建控件"的线程以外的线程访问控件"。

将Panel添加到不同线程上的窗体

您必须调用该操作:

Thread form = new Thread(()=>
{
    Form displayForm = new Form();
    displayForm.Show();
    display.Invoke((MethodInvoker)delegate { displayForm.Controls.Add(display); });
});

老实说,我看不出你有什么理由要这么做。这是一个非常简单快速的操作,您应该在UI线程上进行操作,而不是创建新线程。