在Windows Forms編程中涉及到的多線程操作,多個線程來更新Forms上的控制項,比如textbox等。但是如果你直接線上程中更新textbox的text屬性是會報錯的。因為textbox是主線程建立的,子線程訪問的時候就會報錯。
解決方案如下,建立一個Windows Forms項目,拖拉一個textbox和button就可以。
點擊button來啟動線程,線上程中修改textbox的值。
這需要使用委託類
//啟動線程
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Test));
thread.Start();
}
delegate void add();//委託
public void Test()
{
this.BeginInvoke(new add(dd));
}
public void dd();//委託方法
{
this.textBox1.Text = "AA";
}
這樣就可以實現。
當然委託和委託方法可以再設計一下,可以輸入一個參數。修改後的代碼如下:
delegate void add(string input);
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Test));
thread.Start();
}
public void Test()
{
this.BeginInvoke(new add(dd),new object[]{"我暈死了,原來這樣啊"});//注意第二個參數,委託方法的參數就是在這個地方輸入。委託方法中不用轉換就直接是字串了
}
public void dd(string input)
{
this.textBox1.Text = input;
}
再附加一個寫listbox的例子。就是開啟一個線程以後在listbox中寫入累加的數字
//聲明線程對象
System.Threading.Thread thread1 = null;
//建立線程並開啟
thread1 = new Thread(startThread1);
thread1.IsBackground = true;
thread1.Start();
//建立委派物件
delegate void AddList(object o);
//委託用的方法
public void AddListMethod(object o)
{
this.listBox1.Items.Add(o.ToString());
}
//線程調用的方法
public void startThread1()
{
for (int n = 0; n < 10000; n++)
{
this.textBox1.BeginInvoke(new AddList(AddListMethod),new object[]{n});
System.Threading.Thread.Sleep(100);//這個地方只是為了防止線程運行太快,數字會慢慢在listbox上顯示
}
}