技术交流 > 心得分享 > 浅谈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线程),主线程继续向下执行;委托结束时,如果有返回值,子线程将返回值传递给主线程;如果有回调函数,子线程将继续执行回调函数。



2023-02-06 14:24:36
评论
  • 评论加载中...

评论内容: