C# 通过线程创建控件

C# 通过线程创建控件,c#,multithreading,controls,C#,Multithreading,Controls,是否可以通过类似于此非工作代码的线程来创建控件 Thread t1 = new Thread(() => Panel p = create_control(param1,param2); t1.start(); this.Controls.Add(p); create\u控件类类似于: Panel p = new Panel(); p.Location... p.Size... p.Name... return p; 我想这就是你要问的 首先,您有一个类,它可以创建带有参数的控件 pu

是否可以通过类似于此非工作代码的线程来创建控件

Thread t1 = new Thread(() => Panel p = create_control(param1,param2);
t1.start();
this.Controls.Add(p);
create\u控件
类类似于:

Panel p = new Panel();
p.Location...
p.Size...
p.Name...
return p;

我想这就是你要问的

首先,您有一个类,它可以创建带有参数的控件

public class CreateControl
{

    public Control Create(string name, Point location, Size size)
    {
        Panel p = new Panel();
        p.Name = name;
        p.Location = location;
        p.Size = size;
        p.BackColor = Color.Red;

        return p;
    }
}
然后在winform中,您可以使用线程创建控件,并且当您使用Tinwor建议的窗体调用方法将控件添加到窗体时,需要避免出现跨线程操作异常

public partial class Form1 : Form
{
    public delegate void AddToControl(Control control);
    public AddToControl MyAddToControl;

    public Form1()
    {
        InitializeComponent();

    }


    private void button1_Click(object sender, EventArgs e)
    {
        Thread t1 = new Thread((ThreadStart)delegate
                                                {
                                                    CreateControl c = new CreateControl();
                                                    Panel p = (Panel)c.Create("panel_1", new Point(10, 10), new Size(100, 100));
                                                    AddControlToControls(this, p);
                                                });
        t1.Start();
    }

    public void AddControlToControls(Control parent, Control control)
    {
        MyAddToControl = new AddToControl(this.AddControl);
        parent.Invoke(this.MyAddToControl, control);
    }

    public void AddControl(Control control)
    {
        this.Controls.Add(control);
    }
}

所以基本上是可以做到的。我相信代码可以得到改进,使其更加简洁。希望这有帮助。

如果是wpf使用Dispatcher,您应该问的问题是:“我为什么要这样做?”。是的,可能,但您为什么要这样做?在WinForms中,如果在一个线程中创建控件,则无法将其添加到在另一个线程中创建的控件中。(简单地说,这是无用的)我对@wudzik这个参数知道得不多。但是如果我记得正确的话,可以使用调用委托来完成吗?不,我只是有很多面板、标签、工具提示,。。。加载一个线程需要很长时间。所以我会在一个线程中准备面板,在另一个线程上添加标签,依此类推。为了控制交叉线程,我将在表单中添加每个准备好的控件,我从表单中调用线程。此外,连接线程也会有很大帮助。顺便说一句-西蒙的有用评论…谢谢用户1584413。不幸的是,它并没有解决我的问题,只是因为我的代码比我发布的代码复杂得多。奇怪的是,加载持续的时间比原始时间要长。无论如何,你的回答可能会帮助其他人寻找类似的主题。老实说,我确实同意其他人的看法,为什么你首先需要这样做,在某些情况下加载线程同时加快速度可能会非常昂贵,因为它需要为它们创建线程和存储等,因此,我并不感到惊讶,它可能会减慢你。但我同意其他人的意见,但你们没有问我是否应该这样做,你们问是否可以做到。如果您在一个表单上有这么多控件,那么尝试将它们分离为用户控件怎么样?这样可能会使它们更易于管理,并且只根据需要加载它们,而不是全部加载到表单上。