技术交流 > 心得分享 > 浅谈C#中Control.Invoke、Control.BeginInvoke 与Delegate.Invoke、Delegate.BeginInvoke 的区别与联系。
浅谈C#中Control.Invoke、Control.BeginInvoke 与Delegate.Invoke、Delegate.BeginInvoke 的区别与联系。
1.Control的Invoke、BeginInvoke
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。
Control的Invoke和BeginInvoke的委托方法是在主线程,即UI线程上执行。(也就是说如果你的委托方法用来取花费时间长的数据,然后更新界面什么的,千万别在主线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死)
Invoke会阻塞主支线程,BeginInvoke只会阻塞主线程,不会阻塞支线程!因此BeginInvoke的异步执行是指相对于支线程异步,而不是相对于主线程异步。
2.Delegate的Invoke、BeginInvoke
Delegate.Invoke在当前线程中执行委托,委托执行时阻塞当前线程,知道委托执行完毕,当前线程才继续向下执行。类似方法的常规调用。
Delegate.BeginInvoke委托的BeginInvoke方法,在线程池分配的子线程中执行委托;委托执行时不会阻塞主线程(调用委托的BeginInvoke线程),主线程继续向下执行;委托结束时,如果有返回值,子线程将返回值传递给主线程;如果有回调函数,子线程将继续执行回调函数。