利用Invoke和或BeginInvoke实现线程间操作UI的简单例子。
1 /* 2 窗体包含一个button和一个richtextbox控件 3 * 注:必须在子线程中执行Invoke和或BeginInvoke 4 */ 5 /// <summary> 6 /// 线程委托 7 /// </summary> 8 public delegate void g_Delegate1(); 9 /// <summary> 10 /// 线程调用BeginInvoke修改UI委托 11 /// </summary> 12 public delegate void g_Delegate2(); 13 /// <summary> 14 /// 线程函数 15 /// </summary> 16 public void UpdateTxt1() 17 { 18 g_Delegate2 pD2 = new g_Delegate2(UpdateTxt2);//在新的线程中建立委托,指向UpdateTxt2函数 19 while (true) 20 { 21 this.Invoke(pD2);//子线程执行委托pd2即函数UpdateTxt2,达到线程间操作UI的目的 22 //this.BeginInvoke(pD2); 23 Thread.Sleep(1000); 24 } 25 } 26 /// <summary> 27 /// 修改UI函数 28 /// </summary> 29 public void UpdateTxt2() 30 { 31 Random pRandom = new Random(); 32 int r = pRandom.Next(255); 33 int g = pRandom.Next(255); 34 int b = pRandom.Next(255); 35 richTextBox1.Text=(string.Format("颜色组合: 红:{0} 绿:{1} 蓝:{2} ", r, g, b)); 36 this.BackColor = Color.FromArgb(r, g, b); 37 } 38 /// <summary> 39 /// 按钮事件 40 /// </summary> 41 /// <param name="sender"></param> 42 /// <param name="e"></param> 43 private void button1_Click(object sender, EventArgs e) 44 { 45 g_Delegate1 pD1 = new g_Delegate1(UpdateTxt1);//线程委托,指向UpdateTxt1 46 Thread pThread = new Thread(new ThreadStart(pD1));//新建线程,指向委托pD1即函数UpdateTxt1 47 pThread.Start();//开始新线程 48 }
效果图如下: