c# Invoke 和 BeginInvoke 区别
2009-11-06 16:38
近日,被 Control 的 Invoke 和 BeginInvoke 搞的头大,就查了些相关的资料,整理如下。
感谢这篇文章对我的理解 Invoke 和 BeginInvoke 的真正含义 。
(一)Control 的 Invoke 和 BeginInvoke
我们要基于以下认识:
(1)Control 的 Invoke 和 BeginInvoke 与 Delegate 的 Invoke 和 BeginInvoke 是不同的。
(2)Control 的 Invoke 和 BeginInvoke 的参数为 delegate,委托的方法是在 Control 的线
程上执行的,也就是我们平时所说的 UI 线程。
我们以代码(一)来看(Control 的 Invoke)
private delegate void InvokeDelegate();
private void InvokeMethod(){
//C 代码段
}
private void butInvoke_Click(object sender, EventArgs e) {
//A 代码段.......
this.Invoke(new InvokeDelegate(InvokeMethod));
//B 代码段......
}
你觉得代码的执行顺序是什么呢?记好 Control 的 Invoke 和 BeginInvoke 都执行在主线程
即 UI 线程上
A------>C---------------->B
解释:(1)A 在 UI 线程上执行完后,开始 Invoke,Invoke 是同步
(2)代码段 B 并不执行,而是立即在 UI 线程上执行 InvokeMethod 方法,即代码段 C。
(3)InvokeMethod 方法执行完后,代码段 C 才在 UI 线程上继续执行。
看看代码(二),Control 的 BeginInvoke
private delegate void BeginInvokeDelegate();
private void BeginInvokeMethod(){
//C 代码段
}
private void butBeginInvoke_Click(object sender, EventArgs e) {
//A 代码段.......
this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod));
//B 代码段......