我们一般常用control(也就是主线程)和delegate(委托)来使用invoke和beginivoke。
在这里我先讲讲invoke、begininvoke之间的区别:
Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行
两个invoke和begininvoke如果在主线线程运行的话,都会阻塞新线程。
我目前见到过的control这两个方法的使用是这样的一种形式
这是UI线程里的一段代码
public void HandleMessage(IBMessage message)
{
if (this.InvokeRequired)
{
MessageHandlerDelegate callback = new
MessageHandlerDelegate(HandleMessage);
this.Invoke(callback, new object[] { message });
}
else
{
UpdateUI(message);
}
}
下面我们来理解这段代码: message我们不用管,只是一个参数,而UpdateUI(message);是UI线程里一个方法
this.InvokeRequired是用来判断调用handlemessage的这个线程是否为UI主线程或者说创建它线程,但是要注意的是,这里的结果恰好相反,如果是创建它的以外的线程,反而会为真,那么我们可以看到为真后执行了下面两句代码
MessageHandlerDelegate callback = new MessageHandlerDelegate(HandleMessage);
this.Invoke(callback, new object[] { message });
那么是什么意思呢?
这里就是我们control.invoke的使用了,这里的作用是阻塞当前创建它的以外的线程返回到创建它的线程执行下面的else方法,当然我们也可以理解这段代码为其他线程要想调用这个方法就必须回到主线程调用该方法,这个做法保证了控件的安全。
如果不好理解的话,我们可以这样理解
有人想找你借钱,他可以直接在你的钱包中拿,这样太不安全,因此必须让别人先要告诉你,你再从自己的钱包把钱拿出来借给别人,这样就安全了