利用Invoke和或BeginInvoke实现线程间操作UI的简单例子。
/*
窗体包含一个button和一个richtextbox控件
* 注:必须在子线程中执行Invoke和或BeginInvoke
*/
/// <summary>
/// 线程委托
/// </summary>
public delegate void g_Delegate1();
/// <summary>
/// 线程调用BeginInvoke修改UI委托
/// </summary>
public delegate void g_Delegate2();
/// <summary>
/// 线程函数
/// </summary>
public void UpdateTxt1()
{
g_Delegate2 pD2 = new g_Delegate2(UpdateTxt2);//在新的线程中建立委托,指向UpdateTxt2函数
while (true)
{
this.Invoke(pD2);//子线程执行委托pd2即函数UpdateTxt2,达到线程间操作UI的目的
//this.BeginInvoke(pD2);
Thread.Sleep();
}
}
/// <summary>
/// 修改UI函数
/// </summary>
public void UpdateTxt2()
{
Random pRandom = new Random();
int r = pRandom.Next();
int g = pRandom.Next();
int b = pRandom.Next();
richTextBox1.Text=(string.Format("颜色组合:\r\n红:{0}\r\n绿:{1}\r\n蓝:{2}\r\n", r, g, b));
this.BackColor = Color.FromArgb(r, g, b);
}
/// <summary>
/// 按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
g_Delegate1 pD1 = new g_Delegate1(UpdateTxt1);//线程委托,指向UpdateTxt1
Thread pThread = new Thread(new ThreadStart(pD1));//新建线程,指向委托pD1即函数UpdateTxt1
pThread.Start();//开始新线程
}
效果图如下: