Invoke()的作用是:在應用程序的主線程上執行指定的委托。一般應用:在輔助線程中修改UI線程( 主線程 )中對象的屬性時,調用this.Invoke();
1 //測試的窗體 2 public class TestForm : Form 3 { 4 //創建一個Button對象 5 private Button button = new Button(); 6 //構造函數 7 public TestForm() 8 { 9 //設置按鈕的屬性 10 button.Size = new Size(150, 100); //大小 11 button.Click += Button1_Clicked; //注冊事件 12 button.Text = "點擊開始測試"; //設置顯示文本 13 this.Controls.Add(button); //添加到窗體上 14 this.Text = "多線程范例"; //設置窗體的標題欄文本 15 } 16 //按鈕的Click事件響應方法 17 public void Button1_Clicked(object sender, EventArgs e) 18 { 19 //啟動一個線程 20 new Thread(ThreadProc).Start(); 21 } 22 //線程函數 23 public void ThreadProc() 24 { 25 //this.Invoke就是跨線程訪問ui的方法,也是本文的范例 26 //首先invoke一個匿名委托,將button對象禁用 27 this.Invoke((EventHandler)delegate 28 { 29 button.Enabled = false; 30 }); 31 32 //記錄一個時間戳,以演示倒計時效果 33 int tick = Environment.TickCount; 34 while (Environment.TickCount - tick < 1000) 35 { 36 //跨線程調用更新窗體上控件的屬性,這里是更新這個按鈕對象的Text屬性 37 this.Invoke((EventHandler)delegate 38 { 39 button.Text = (1000 - Environment.TickCount + tick).ToString() + "微秒后開始更新"; 40 }); 41 //做一個延遲,避免太快了,視覺效果不好。 42 Thread.Sleep(100); 43 } 44 //演示,10次數字遞增顯示 45 for (int i = 0; i < 10; i++) 46 { 47 this.Invoke((EventHandler)delegate 48 { 49 button.Text = i.ToString(); 50 }); 51 Thread.Sleep(200); 52 } 53 //雖然不是循環內,請不要忘記,你的調用依然在輔助線程中,所以,還是需要invoke的。 54 //還原狀態,設置按鈕的文本為初始狀態,設置按鈕可用。 55 this.Invoke((EventHandler)delegate 56 { 57 button.Text = "點擊開始測試"; 58 button.Enabled = true; 59 }); 60 } 61 }
