在多線程編程中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,多個線程對一個變量同時訪問是非常危險的
所以在編程中我們可以只用Invoke 和 BeginInvoke 來解決這個問題,使多線程中安全的更新界面顯示。
正確的做法是將工作線程中涉及更新界面的代碼封裝為一個方法,通過 Invoke 或者 BeginInvoke 去調用,兩者的區別就是一個導致工作線程等待,而另外一個則不會。
在編程中,由於界面的更新是很頻繁的,所以應盡可能的吧操作對丟給工作線程,盡量讓更新界面的UI線程工作量變少
如果要在子線程中創建其他窗體,也應該有UI線程來創建,方法類似
namespace test
{
public partial class Form1 : Form
{
//定義一個委托
public delegate void MyInvoke(string str1,string str2);
public Form1()
{
InitializeComponent();
}
public void DoWork()
{
//實例化委托
MyInvoke mi = new MyInvoke(UpdateForm);
//啟動委托,讓主線程執行操作
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
}
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
}
}
//啟動一個線程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//線程方法
private void DoWork()
{
this.TextBox1.Text="我是一個文本框";
}