Winform 关于委托与Invoke和Begin Invoke的使用
这方面的文章已经写得很详细了,特地摘引两篇文章
http://www.cnblogs.com/c2303191/articles/826571.html
http://www.cnblogs.com/EasonLeung/p/3683492.html
http://www.cnblogs.com/Rustle/articles/11301.aspx
然后我想把自己的理解记录下来,做一个笔记。
1.Control的Invoke和BeginInvoke的委托方法是在主线程,即UI线程上执行的,异步是指相对于调用BeginInvoke的线程异步,而不是相对于UI线程异步,BeginInvoke的原理是将调用的方法Marshal成消息,然后调用Win32 API中的RegisterWindowMessage()向UI窗口发送消息
2.委托的执行过程类似于线程的执行(实际上本质就是线程),当委托被Invoke以后,程序会开启一个异步线程执行委托,当委托执行完毕时线程自动终止
3.Invoke 和 BeginInvoke 就是为了解决在多线程中安全的更新界面显示而出现的。
将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会(工作线程即UI线程)
4.在新的线程中使用Invoke和BeginInvoke这种方式,其调用的委托其实相当于“注入”到了主控制线程中,它取得了主线程的控制
5.主线程表示Control.Invoke或Control.BeginInvoke中Control所在的线程,即创建该Control的线程。(一般为UI线程)
支线程表示调用Invoke或BeginInvoke的线程。
- Invoke、BeginInvoke始终在主线程中执行。
- Invoke被调用时就会直接执行,也就是直接阻塞线程(包括主支线程),直到它结束。而BeginInvoke只有等支线程结束或者调用EndInvoke、Invoke时才会开始执行。
- Invoke不管在哪里执行都会造成主线程的阻塞。而BeginInvoke只会阻塞支线程,而对于主线程是异步执行。(注意,如果在主线程中调用,也会阻塞主线程)。
- 在支线程中,应该使用BeginInvoke,否则调用Invoke将导致支线程阻塞主线程,该支线程就没有存在的意义。(当然有特殊需求除外)。
Winform 关于委托与Invoke和Begin Invoke的使用的更多相关文章
- WinForm二三事(三)Control.Invoke&Control.BeginInvoke
http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html 这个系列从2009年写到2010年,差点又成太监文.随着WPF/Silver ...
- 多线程+委托的安全访问(invoke)
1.声明方法 2.声明委托类型 3.创建委托对象 4.启动线程 5.在线程调用的方法里通过Control的Invoke方法执行委托 public Form1() { InitializeCompone ...
- WinForm多线程+委托防止界面假死
当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...
- WinForm多线程+委托防止界面卡死
1.当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Gener ...
- winform利用委托delegate进行窗体间通信
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- winform利用委托delegate进行窗体间通信,相同标题已经存在??
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- winform 利用委托实现窗体传值
父窗体:Form1 ,有个 textbox1.text ,有个button1 子窗体:Form2 ,有个 textbox1.text ,有个button1 修改Form1 的textbox1. ...
- Winform利用委托进行窗体间的传值
在form1.cs中 1.委托的定义 //定义一个委托 public delegate void AddUsrEventHandler(object sender, AddUsrEventHandle ...
- winform使用委托和事件在窗体之间传值
定义委托和事件,并且触发这个事件 //定义委托 public delegate void ShowOutStockDelegate(List<OutStockResultDto> outS ...
随机推荐
- java 面向对象编程-- 第15章 集合框架
1. 集合特点:元素类型不同.集合长度可变.空间不固定 2. java中对一些数据结构和算法进行了封装即集合.集合也是一种对象,用于存储.检索.操作和传输对象. 3. JCF(Java Coll ...
- 使用read write 读写socket
一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用. 由此网络程序里最基本的函数就是read和write函数了. 写函数: ssize_t write(int fd, con ...
- SG函数 模板
int get_SG(int x) { ) return SG[x]; ]={}; ;i<=n;i++) ) v[get_SG(x-s[i])]=; int i; ;v[i];i++); SG[ ...
- NOIP 2013提高组day 1 T 1转圈游戏 快速幂
描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推 ...
- WP8.1 Study5:Data binding数据绑定
一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样 ...
- Program C--二分
My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N ...
- mybatis写mapper文件注意事项(转)
原文链接:http://wksandy.iteye.com/blog/1443133 xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响 < < > & ...
- for循环和while循环的区别
public class Xunhuanqubie { public static void main(String[] args){ int i = 0; while(i<8){ System ...
- JAVA SERVLET专题(上)
SERVLET简介 ·Java Servlet 是和平台无关的服务器端组件,它运行在Servlet容器中.Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和 ...
- pdo 的配置与启用
PDO(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除.该扩展提供PHP内置类 PDO来对数据库进行 访问,不 ...