加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Invoke()/BeginInvoke()区别

发布时间:2021-07-06 05:53:35 所属栏目:大数据 来源: https://blog.csdn.net/kasama1
导读:Invoke()/BeginInvoke()区别 博客分类: ? C# .net Blog? @H_301_16@ 查看MSDN如下: ??? Control . . :: . Invoke ????????? --- 在拥有此控件的基础窗口句柄的线程上执行委托。 ??? Control . . :: . BeginInvoke ? --- 在创建控件的基础句柄所在线程上异

Invoke()/BeginInvoke()区别

  • 博客分类:?
  • C#
.net Blog? @H_301_16@

查看MSDN如下:

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

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

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

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

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

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

?

转自:http://blog.csdn.net/xiaogang3438792/archive/2009/05/11/4166911.aspx

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读