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的上下文中执行。

    https://blog.csdn.net/xiaogang3438792/article/details/4166911

  • 相关阅读:
    【转】Tomcat中部署java web应用程序
    【转】如何安装mysql服务
    【转】java_web开发入门
    【转】SVN 查看历史信息
    【转】java编译错误 程序包javax.servlet不存在javax.servlet.*
    【转】MySQL5安装的图解(mysql-5.0.27-win32.zip)
    【转】JAVA变量path , classpth ,java_home设设置作用和作用
    intellij idea 10.5介绍
    Java中的IO与NIO
    javaWeb完成注册功能
  • 原文地址:https://www.cnblogs.com/hedianzhan/p/8732942.html
Copyright © 2011-2022 走看看