zoukankan      html  css  js  c++  java
  • 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的上下文中执行。

  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/weichao975/p/1785812.html
Copyright © 2011-2022 走看看