C#在某個線程上創建的控件不能成為在另一個線程上創建的控件的父級


首先在form1的窗體載入中新建了一個Class1對象並將本身的引用傳遞進入其構造函數,然后在Class1的構造函數中創建一個線程。該線程所代理的方法事件是本類中的一個add方法。而add方法的內容則是在form1上放一個textbox.
然而這個流程你需要注意的有幾個問題:
1.哪個是主線程?所謂主線程是第一個啟動的線程,是從main開始的。form1的這個窗體是由主線程創建的。
2.Thread t的線程是什么?t是由主線程創建的,t的操作內容是在由主線程創建的窗體上放一個textbox.
也就是說,t的操作是跨線程的窗體操作。雖然把CheckForIllegalCrossThreadCalls 設置成了false,但是還存在在某個線程上創建的控件不能成為在另一個線程上創建的控件的父級這個異常。
解決辦法:
1.不要線程,只在一個主線程中操作。此時你在class1中添加控件也好,在form1中寫個方法來添加控件也好,都是可行的。
2.通過代理來實現。在對form1對象的操作中
if(form1.InvokeRequired)
{
form1.Invoke(d);//d為在主線程中創建的代理引用
//d所代理的方法應該是添加控件的內容
}
else
{
form1.Controls.add(textBox1);//直接使用
}
//代碼
class Class1
{
Form1 f1;
TextBox textBox1;
delegate void addDelegate();
addDelegate d;
public Class1(Form1 f1)
{
this.f1 = f1;
d=new addDelegate(f1.add());//此處的add是在form1中的方法
Thread t = new Thread(new ThreadStart(add));
t.Start();
}
public void add()
{
if(f1.InvokeRequired)
{
f1.Invoke(d); //使用代理
}
else
{
f1.Controls.add(new TextBox());//...直接調用
}
}
}
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM