美文网首页
控件为何会需要Invoke或BeginInvoke方法呢?

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

作者: 曦航老袁 | 来源:发表于2019-02-13 22:31 被阅读0次

因为控件的这样一个特点:控件的数据(或属性)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的,则其它任何非A线程都不允许修改控件的值,只可以访问(读取)。控件的值只能在线程A上进行更改。
基于以上原因,而现实中又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。Invoke()/BeginInvoke() 就应运而生了。它们使线程B可以间接地更改在线程A中创建的控件的值。但真正更改控件值的操作仍然是在线程A的上下文中执行。

查看MSDN如下:

Control..Invoke ---> 在拥有此控件的基础窗口句柄的线程上执行委托。
Control..BeginInvoke ---> 在创建控件的基础句柄所在线程上异步执行委托。

显然,Invoke() 与 BeginInvoke() 方法间的主要区别在于“异步”关键字眼。
也就是说,

  1. Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法执行完成返回才继续执行后面的代码,表现出“同步”的概念。
  2. BeginInvoke() 调用时,会在拥有此控件的基础窗口句柄的线程上来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
  3. EndInvoke() ,如果想获取 BeginInvoke() 执行完毕后的结果时,可以调用此方法来获取。

相关文章

网友评论

      本文标题:控件为何会需要Invoke或BeginInvoke方法呢?

      本文链接:https://www.haomeiwen.com/subject/upvjeqtx.html