打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Invoke()/BeginInvoke()区别
Invoke()/BeginInvoke()区别


查看MSDN如下:

   Control..::.Invoke          ---> 在拥有此控件的基础窗口句柄的线程上执行委托。

   Control..::.BeginInvoke  ---> 在创建控件的基础句柄所在线程上异步执行委托。

  显然,Invoke() 与 BeginInvoke() 方法间的主要区别在于“异步”关键字眼。
 
 
  也就是说,
 
Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。

控件为何会需要Invoke()或BeginInvoke()方法呢?

因为控件的这样一个特点:控件的数据(或状态)值只能在创建控件的那个线程上被更改。
也就是说如果控件是在线程A上创建的,则其它任何线程B都不允许修改控件的值,只可以访问(读取)。
控件的值只能在线程A上进行更改。

基于以上原因,而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。
所以,Invoke()/BeginInvoke() 就出现了。使线程B可以间接地更改在线程A中创建的控件的值。
真正更改控件值的操作仍然是在线程A的上下文中执行。

public delegate void InvokeDelegate();


private void Invoke_Click(object sender, EventArgs e)
{
   myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
}

public void InvokeMethod()
{
   myTextBox.Text = "Executed the given delegate";
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# 多线程防止卡死
【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
Invoke and BeginInvoke
C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
C# 跨线程调用控件
谈.Net委托与线程——解决窗体假死 - 横竖都溢 - 博客园
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服