標籤:
轉自:http://blog.3snews.net/html/30/34530-27563.html
在多線程編程中,我們經常要在背景工作執行緒中去更新介面顯示,而在多線程中直接調用介面控制項的方法是錯誤的做法,Invoke 和 BeginInvoke 就是為瞭解決這個問題而出現的,使你在多線程中安全的更新介面顯示。
正確的做法是將背景工作執行緒中涉及更新介面的代碼封裝為一個方法,通過 Invoke 或者 BeginInvoke去調用,兩者的區別就是一個導致背景工作執行緒等待,而另外一個則不會。
而所謂的“一面響應操作,一面添加節點”永遠只能是相對的,使 UI 線程的負擔不至於太大而已,因為介面的正確更新始終要通過 UI線程去做,我們要做的事情是在背景工作執行緒中包攬大部分的運算,而將對純粹的介面更新放到 UI 線程中去做,這樣也就達到了減輕 UI線程負擔的目的了。
舉個簡單例子說明下使用方法,比如你在啟動一個線程,線上程的方法中想更新表單中的一個TextBox..
1 using System.Threading; 2 3 //啟動一個線程 4 Thread thread=new Thread(new ThreadStart(DoWork)); 5 thread.Start(); 6 7 //線程方法 8 private void DoWork() 9 { 10 this.TextBox1.Text="我是一個文字框"; 11 }
如果你像上面操作,在VS2005或2008裡是會有異常的...
正確的做法是用Invoke\BeginInvoke
1 using System.Threading; 2 namespace test 3 { 4 public partial class Form1 : Form 5 { 6 public delegate void MyInvoke(string str1,string str2); 7 public Form1() 8 { 9 InitializeComponent();10 11 12 }13 public void DoWork()14 {15 MyInvoke mi = new MyInvoke(UpdateForm);16 this.BeginInvoke(mi, new Object[] {"我是文字框","haha"});17 }18 public void UpdateForm(string param1,string parm2)19 {20 this.textBox1.Text = param1+parm2;21 }22 private void button1_Click(object sender, EventArgs e)23 {24 Thread thread = new Thread(new ThreadStart(DoWork));25 thread.Start();26 }27 }28 }
C#中Invoke的用法(轉)