https://www.cnblogs.com/Olive116/archive/2012/10/06/2713098.html
在以前的章节中,我们不只一次的提到过,不能在非创建UI控件的线程中操作UI元素,否则会和UI控件创建线程(一般是主线程)产生冲突,造成不可预料的后果。
该如何解决这个问题呢?除了上一节所讲的BackgroundWorker和Timer以外,微软将Control类实现了ISynchronizeInvoke接口,提供了Invoke和BeginInvoke方法来提供让其它线程更新GUI界面控件的机制。
下边还是通过一个例子给大家讲解一下Control.Invoke()和Control.BeginInvoke();
首先新建一个WinForm应用程序,在Form窗体上做如下布局:
然后,新建一个委托
public delegate void ShowTime();
在Control。Invoke()按钮的click事件里添加如下代码:
Button_click(object sender ,EventArgs e)
{
ShowTime showTime = new ShowTime(Time);
this.Invoke(showTime);//Invoke()方法需要一个委托参数,也就是要执行委托方法
//在执行委托之后弹出对话框,显示当前的线程ID,是否为后台线程
MessageBox.Show("当前线程ID为:" + Thread.CurrentThread.ManagedThreadId + "是否为后台线程?" + Thread.CurrentThread.IsBackground);
}
//委托调用的方法
private void Time()
{
this.button10.Text = DateTime.Now.ToString();//将Button.Text属性设置为当前的时间
for (int i = 0; i <= 100; i++)
{
sum += i;
}
MessageBox.Show("Sum值为:" + sum + "当前线程ID为:" + Thread.CurrentThread.ManagedThreadId + "是否为后台线程?" + Thread.CurrentThread.IsBackground);//显示当前的线程ID,是否为后台线程
}
实验结果如下:依次是
1、