轉自原文 C# this.invoke()作用 多線程操作UI
Invoke()的作用是:在應用程序的主線程上執行指定的委托。一般應用:在輔助線程中修改UI線程( 主線程 )中對象的屬性時,調用this.Invoke();
//測試的窗體 public class TestForm : Form { //創建一個Button對象 private Button button = new Button(); //構造函數 public TestForm() { //設置按鈕的屬性 button.Size = new Size(150, 100); //大小 button.Click += Button1_Clicked; //注冊事件 button.Text = "點擊開始測試"; //設置顯示文本 this.Controls.Add(button); //添加到窗體上 this.Text = "多線程范例"; //設置窗體的標題欄文本 } //按鈕的Click事件響應方法 public void Button1_Clicked(object sender, EventArgs e) { //啟動一個線程 new Thread(ThreadProc).Start(); } //線程函數 public void ThreadProc() { //this.Invoke就是跨線程訪問ui的方法,也是本文的范例 //首先invoke一個匿名委托,將button對象禁用 this.Invoke((EventHandler)delegate { button.Enabled = false; }); //記錄一個時間戳,以演示倒計時效果 int tick = Environment.TickCount; while (Environment.TickCount - tick < 1000) { //跨線程調用更新窗體上控件的屬性,這里是更新這個按鈕對象的Text屬性 this.Invoke((EventHandler)delegate { button.Text = (1000 - Environment.TickCount + tick).ToString() + "微秒后開始更新"; }); //做一個延遲,避免太快了,視覺效果不好。 Thread.Sleep(100); } //演示,10次數字遞增顯示 for (int i = 0; i < 10; i++) { this.Invoke((EventHandler)delegate { button.Text = i.ToString(); }); Thread.Sleep(200); } //雖然不是循環內,請不要忘記,你的調用依然在輔助線程中,所以,還是需要invoke的。 //還原狀態,設置按鈕的文本為初始狀態,設置按鈕可用。 this.Invoke((EventHandler)delegate { button.Text = "點擊開始測試"; button.Enabled = true; }); } }