是否有可能通过线程创建类似于这些非工作代码的控件?通过线程创建控件
Thread t1 = new Thread(() => Panel p = create_control(param1,param2);
t1.start();
this.Controls.Add(p);
的create_control
类类似于:
Panel p = new Panel();
p.Location...
p.Size...
p.Name...
return p;
是否有可能通过线程创建类似于这些非工作代码的控件?通过线程创建控件
Thread t1 = new Thread(() => Panel p = create_control(param1,param2);
t1.start();
this.Controls.Add(p);
的create_control
类类似于:
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中你可以使用线程来创建控件,而你也可以d通过使用表单的调用方法(如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);
}
}
所以基本上是可以做到的。我相信可以改进代码以使其更加简洁。希望这可以帮助。
谢谢user1584413。通常,它不能解决我的问题,但仅仅是因为我的代码比我发布的复杂得多。奇怪的是,加载持续更长的时间,比原来的时间是。无论如何,你的答案可能会帮助别人寻找类似的话题。 – user2039470
老实说,我同意其他人对你为什么首先要这样做,加载线程,而在某些情况下加快速度,在其他情况下可能会相当昂贵,因为它需要为他们创建线程和存储等,所以我不惊讶它可能会减慢你的速度。但是,虽然我同意其他人你没有问我应该这样做,你问是否可以完成。如果你在单一表单上有很多控件,试图将它们分离到用户控件中,可能会使它们更易于管理,并且只根据需要加载它们,而不是全部在表单加载上。 –
如果它是wpf使用调度程序 – wudzik
你应该问的问题是:“我为什么要这样做?”。 –
是的,可能,但你为什么要这么做?在WinForms中,如果你在一个线程中创建一个控件,你不能将它添加到在另一个线程中创建的控件中(简直没用) –