我理解的invoke和begininvoke

我理解的invoke和begininvoke

  一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。

 首先说下,invoke和begininvoke的使用有两种情况:

  1. control中的invoke、begininvoke。

  2. delegrate中的invoke、begininvoke。  

  这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。

  control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。

  control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。

  根据这两个概念我们大致理解invoke表是同步、begininvoke表示异步。但是如何来进行同步和异步呢?我们来做一个测试。

invoke 例子:

 private void button1_Click(object sender, EventArgs e)
{
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"AAA");
            invokeThread = new Thread(new ThreadStart(StartMethod));
            invokeThread.Start();
            string a = string.Empty;
            for (int i = 0; i < 3; i++)      //调整循环次数,看的会更清楚
            {
                Thread.Sleep(1000);   
                a = a + "B";
            }
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+a);
}

 private void StartMethod()
{
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"CCC");
            button1.Invoke(new invokeDelegate(invokeMethod));  
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"DDD");
}

 private void invokeMethod()
{
            //Thread.Sleep(3000);
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "EEE");

结论:我们运行后,看下程序的运行顺序,1AAA->3CCC和1BBB->1EEE ->3DDD 。 

解释:主线程运行1AAA,然后1BBB和子线程3CCC同时执行,然后通过invoke来将invokemethod方法提交给主线程,然后子线程等待主线程执行,直到主线程将invokemethod方法执行完成(期间必须等待主线程的任务执行完成,才会去执行invoke提交的任务),最后执行子线程3DDD。

 

begininvoke 例子:

private void button1_Click(object sender, EventArgs e)
{
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"AAA");
            invokeThread = new Thread(new ThreadStart(StartMethod));
            invokeThread.Start();
            string a = string.Empty;
            for (int i = 0; i < 3; i++)      //调整循环次数,看的会更清楚
            {
                Thread.Sleep(1000);   
                a = a + "B";
            }
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+a);
}

 private void StartMethod()
{
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"CCC");
            button1.BeginInvoke(new invokeDelegate(invokeMethod));  
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()+"DDD");
}

 private void beginInvokeMethod()
        {
            //Thread.Sleep(3000);
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "EEEEEEEEEEEE");
        }

 

结论: 我们运行后看看执行的结果:1AAA->1BBB和3CCC->1EEE和3DDD。

解释: 主线程运行1AAA,然后1BBB和子线程3CCC同时执行,然后通过begininvoke来将invokemethod方法提交给主线程,然后主线程执行1EEE(主线程自己的任务执行完成), 同时子线程继续执行3DDD。

 

通过这个两段代码的测试比较,我们会发现其实invoke和begininvoke所提交的委托方法都是在主线程中执行的,其实根据我invoke和begininvoke的定义我们要在子线程中来看这个问题,在invoke例子中我们会发现invoke所提交的委托方法执行完成后,才能继续执行DDD;在begininvoke例子中我们会发现begininvoke所提交的委托方法后,子线程讲继续执行DDD,不需要等待委托方法的完成。 那么现在我们在回想下invoke(同步)和begininvoke(异步)的概念,其实它们所说的意思是相对于子线程而言的,其实对于控件的调用总是由主线程来执行的。我们很多人搞不清这个同步和异步,主要还是因为我们把参照物选错了。其实有时候光看概念是很容易理解错误的。

 

posted on 2011-11-03 11:57 zhao.zk 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Z-King/archive/2011/11/03/2234337.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变换例题_用初等变换求逆矩阵的小小解释

在我们学习逆矩阵的过程中&#xff0c;肯定会遇到这样一种求逆矩阵的方法&#xff1a;若A是一个n阶可逆矩阵&#xff0c;&#xff08;虚竖线打不出&#xff0c;凑合着看吧&#xff01;&#xff09;这一过程中经历了一系列初等行变换&#xff0c;并且我们下结论说&#xff1a;中…

【算法设计与分析】08 序列求和的方法

本篇文章学习数列求和的一些方法。这些方法对后面学习算法的时间复杂度非常有帮助。 文章目录1. 数列求和公式1.1 二分搜索的时间复杂度求解2 估计和式上届的放大法3 估计和式渐近的界4 总结1. 数列求和公式 下面这几个数列求和公式都是高中学过的公式。 等差、等比数列和调和…

rufus中gpt和mrb磁盘_计算机关于磁盘的大杂烩

计算机关于磁盘的大杂烩(一)如何判断电脑到底uefi还是bios模式许多现代 PC 都支持了 UEFI 模式&#xff0c;而普通用户很难分辨自己的电脑到底使用的是传统 BIOS 还是 UEFI 模式。该文主要出于对简单制作 Windows 10 安装 U 盘一文的补充说明&#xff0c;这篇文章中我们曾提到可…

UVA 10003 Cutting Sticks

UVA_10003 这是个区间的动态规划问题&#xff0c;首先我们可以补两个端点&#xff0c;然后就按区间长度递增的顺序进行递推即可&#xff0c;区间长度为1时的花费要初始化成0&#xff0c;其余初始化为INF。 转移方程为f[i, j] min{f[i, k] f[k, j] a[j] – a[i]}(i < k &l…

【算法设计与分析】09 递推方程与算法分析

关于什么是递推方程&#xff0c;这里就不再多说了。本文主要讲讲简单的递推方程来求解算法的时间复杂度 文章目录1. 递推方程的引入1.1 插入排序时间复杂度求解1.2 二分归并排序时间复杂度求解2 总结1. 递推方程的引入 汉诺塔问题大家都知道&#xff0c;现在以汉诺塔问题来引入…

华为畅享8plus停产了吗_华为畅享8Plus

华为畅享8plus是一款华为3月22推出的一部新机&#xff0c;很多朋友都表示想入手!前后四摄、4000mAh容量的电池更是为华为畅享8 Plus加分不少。那么华为畅享8Plus值得买吗?华为畅享8Plus好不好用?接下来详细为大家介绍&#xff1a;华为畅享8Plus值得买吗?华为畅享8Plus好不好…

【算法设计与分析】10 差消法化简高阶递推方程

上一篇文章使用递推方程的方法求解了插入排序和二分归并的时间复杂度&#xff0c;本文来求解快速排序的时间复杂度&#xff0c;同样是利用了递推方程法&#xff0c;但是求解该递推方程的方法与以前不一样&#xff1a;差消法 文章目录1. 快速排序的时间复杂度求解2. 总结1. 快速…

python xpath定位打印元素_python基础教程:8种selenium元素定位的实现

前言selenium是一个非常厉害的爬虫利器,不,简直是神器了,它可以自动的控制浏览器,但是你得告诉浏览器,你想干嘛,爬哪里,这时候就要用到元素定位了,在HTML中都有着不同的标签和属性,selenium根据它们来确定你的意图,每个方式都对应两个方法8种方式1.通过 id 定位2.通过 name 定位…

面向对象之多态性(基类引用可以指向子类)

1、派生类的对象和基类是属于的关系&#xff0c;即 对象 is a X类&#xff0c;对象属于X类。 2、多态性的概念&#xff1a; 了解多态性之前&#xff0c;要熟悉引用和对象的区别&#xff1a; 对象存储在堆中&#xff0c;引用&#xff08;符&#xff09;存储在栈中&#xff0c;引…

【算法设计与分析】11 递归树

当前面所学习的迭代法、差消法等不太好解决的问题&#xff0c;可以使用递归树&#xff0c;来很方便的解决。 文章目录1. 递归树的概念1.1 迭代在递归树中的表示2. 递归树的生成规则2.1 递归树生成实例2.2 递归树应用实例3. 总结1. 递归树的概念 递归树是迭代计算的模型递归树的…

【算法设计与分析】12 主定理及其应用

主定理是一个非常有用的定理&#xff0c;前面我们学习的所有知识都可以用主定理来求解&#xff0c;而不必要使用复杂的计算方法来求解 文章目录1. 主定理1.1 主定理的应用背景1.2 主定理内容2. 主定理的应用2.1 求解递推方程 例12.2 求解递推方程 例22.3 求解递推方程 例33. 总…

CSUOJ 1196- Staginner 去爬山

http://acm.csu.edu.cn/OnlineJudge/problem.php?id1196 这道题也是搜索题&#xff0c;还是dfs&#xff0c;我们只需对最后一行进行搜索&#xff0c;然后找到能爬到的最高高度即可&#xff0c;每走 一步我们就计算一次现在处于的高度h&#xff0c;然后与maxh比较。因为开始少写…

迪普交换机清空配置_交换机环路详解

“ The more you know the more you know you dont know”背景近期在交换机配置中发生了一次接线错误导致交换机环路&#xff0c;从而引发广播风暴的一个例子。所以特意花时间了解一下交换机产生广播风暴的原理&#xff0c;并整理了此篇文章&#xff0c;一来可以梳理自己的知识…

前端学习(342):进制只能介于2-36之间Uncaught RangeError: toString() radix argumen

The error is: Uncaught RangeError: toString() radix argument must be between 2 and 36 Just trying to format the date 只能介于2-36之间

单元测试debug过程中,显示variables are not available

注&#xff1a;我的代码是多线程异步执行的 单元测试&#xff0c;代码在进行debug调试时&#xff0c;执行到某一行代码突然就显示variables are not available,多次尝试&#xff0c;始终是会在某一行代码处出现上述的情况。 经过分析&#xff0c;得出原因&#xff1a;单元测试的…

(转)C++的 RTTI 概念和用途

自从1993年Bjarne Stroustrup 〔注1 〕提出有关C 的RTTI功能之建议﹐以及C的异常处理(exception handling)需要RTTI&#xff1b;最近新推出的C 或多或少已提供RTTI。 然而&#xff0c;若不小心使用RTTI&#xff0c;可能会导致软件弹性的降低。本文将介绍RTTI的观念和近况﹐并说…

1400协议是什么和28181区别_1400张拆解案例,够你PPT拆解学习好几遍了!

本文作者&#xff1a;执生若梦简介&#xff1a;「拆P教室」小伙伴、个人公众号「君梦幻灯」指导&#xff1a;优卡优卡大大前段时间开启了一个新栏目&#xff0c;图解计划。拆解一张图片&#xff0c;向其中学习PPT制作技巧。我一直在收集音乐banner图&#xff0c;现在已经达到了…

【算法设计与分析】13 分治策略的设计思想

算法中很多方法都是可以采用分治策略进行设计与优化&#xff0c;那么什么是分治策略&#xff1f;如何使用分治策略进行算法的设计与分析&#xff1f; 文章目录1. 分治策略的基本思想1.1 二分检索的设计思想1.2 二分归并排序的设计思想1.3 Hanoi塔的递归算法2 小结1. 分治策略的…

字段 新增hive_Hive分区表 | 每日五分钟学大数据

数据分区的一般概念存在已久。其可以有多种形式&#xff0c;但是通常使用分区来水平分散压力&#xff0c;将数据从物理上转移到和使用最频繁的用户更近的地方&#xff0c;以及实现其他目的。Hive中有分区表的概念。我们可以看到分区表具有重要的性能优势&#xff0c;而且分区表…