线程实用解析--------(六)Control.Invoke()和Control.BeginInvoke()

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、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值