c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都是糊里又糊涂。
首先感谢下这位仁兄的解读http://www.cnblogs.com/renhaojie/archive/2009/09/10/1564052.html,我在这里只做下自己迷惑的地方的解读。
1,Delegate.BeginInvoke是开起一个新的异步线程执行委托,而Delegate.EndInvoke则是结束这个委托。
2,Delegate.BeginInvoke总有两个参数,参数一IAsyncResult,一个是Object,这两个参数主要是在异步回调的时候会用得到,这个两个参数总是在参数的最后两位,前几位参数是这个委托对应方法的参数。
3.Delegate.EndInvoke返回值是委托所对应方法的返回值。如果委托或者方法未执行完毕,则Delegate.EndInvoke会一直处于阻塞状态;委托或者方法执行完毕,则Delegate.EndInvoke开始执行,并得到返回值。
4,假设IAsyncResult ar = d1.BeginInvoke(1,3000,null,null);则ar.IsCompleted与ar.AsyncHandle.WaitOne(50,flse)具有相同效果,可用来判断改异步委托是否执行完毕。WaitOne(50,flse),50为定义要等待的时间,false为在定义时间内未完成委托时返回值(Bool)
5.对于异步回调有几个问题需要注意,例如d1.BeginInvoke(1, 3000, TakeAWhileDelegateCompleted, d1);
①这个事先执行委托d1(BeginInvoke前的这个d1),后在执行参数的d1,而后在执行TakeAWhileDelegateCompleted方法。
②对于参数d1,如果d1是委托或者方法,这执行这个方法,并将返回值作为TakeAWhileDelegateCompleted的参数传递给TakeAWhileDelegateCompleted,而这个IAsyncResult一定是个方法(这样才能执行异步回调),参数的d1也可以是object类型的变量等
③TakeAWhileDelegateCompleted是BeginInvoke的IAsyncResult参数,但是TakeAWhileDelegateCompleted这个方法或者委托只有一个参数为IAsyncResult类型,该参数值从BeginInvoke的object参数(d1)获得,在TakeAWhileDelegateCompleted内部,可以用IAsyncResult.AsyncState获得参数值。
④对于异步回调,如果主线程结束,则不管委托线程是否结束,所有线程都结束,即如果主线程结束,委托线程未结束,则强迫中止委托线程
6,Invoke方法直接返回方法或者委托的结果,好比执行了Delegate.BeginInvoke和Delegate.EndInvoke
c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调的更多相关文章
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
- C# 异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- C# 1.0 新特性之异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- C#线程通信与异步委托
线程的通知机制 AutoResetEvent是线程实现通知操作的重要方法.通常,AutoResetEvent用于通知正在等待线程已发生事件,允许线程通过发信号互相通信. AutoResetEvent时 ...
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...
- C# 创建线程的简单方式:异步委托 .
定义一个委托调用的方法:TakesAWhile //定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.Writ ...
- [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...
- .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)
一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...
随机推荐
- SEO优化
SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”.SEO是指从自然搜索结果获得网站流量的技术和过程,是在了解搜索引擎自然排名机制的基础上, 对网 ...
- C# 时间计算 今天、昨天、前天、明天 一个月的开始日期与结束日期
C# 时间计算 今天.昨天.前天.明天 class Program { static void Main(string[] args) { ...
- i2c总线,设备,驱动之间的关系
------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...
- Freemark基本语法知识(转)
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
- python 字符串内建函数
方法 描述 string.capitalize() 把字符串的第一个字符大写 string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 string ...
- NPOI读取Excel 数据 转。。。
public DataTable am_Decode() { DataTable table = new DataTable(); string[] strAscDataList = Direct ...
- Caused by: java.lang.NoClassDefFoundError:
tomcat启动不了 报错信息头如下: Caused by: java.lang.NoClassDefFoundError: at java.lang.Class.getDeclaredMethods ...
- Windows And Video Memory
MSDN Blogs > Zemblanity > Windows And Video Memory Windows And Video Memory Tom_Mulcahy 11 F ...
- 3-Spark高级数据分析-第三章 音乐推荐和Audioscrobbler数据集
偏好是无法度量的. 相比其他的机器学习算法,推荐引擎的输出更直观,更容易理解. 接下来三章主要讲述Spark中主要的机器学习算法.其中一章围绕推荐引擎展开,主要介绍音乐推荐.在随后的章节中我们先介绍S ...
- MSP430单片机的两种SPI总线实现方式
MSP430单片机上的SPI总线的实现方式分为两种:硬件实现和软件实现. 二者的抽象层次不同,硬件实现方式下程序员只需要完成总线协议的寄存器层,即一字节(char,8位二进制)数据,而软件实现方式下程 ...