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。不幸的是,它并没有解决我的问题,只是因为我的代码比我发布的代码复杂得多。奇怪的是,加载持续的时间比原始时间要长。无论如何,你的回答可能会帮助其他人寻找类似的主题。老实说,我确实同意其他人的看法,为什么你首先需要这样做,在某些情况下加载线程同时加快速度可能会非常昂贵,因为它需要为它们创建线程和存储等,因此,我并不感到惊讶,它可能会减慢你。但我同意其他人的意见,但你们没有问我是否应该这样做,你们问是否可以做到。如果您在一个表单上有这么多控件,那么尝试将它们分离为用户控件怎么样?这样可能会使它们更易于管理,并且只根据需要加载它们,而不是全部加载到表单上。