是否有可能通過線程創建類似於這些非工作代碼的控件?通過線程創建控件
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中,如果你在一個線程中創建一個控件,你不能將它添加到在另一個線程中創建的控件中(簡直沒用) –