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> ...
随机推荐
- Vector和ArrayList的比较
今天研究了一下Vector和ArrayList的源码,又加深了对这两个类的理解. List接口下一共实现了三个类:ArrayList,Vector,LinkedList.LinkedList就不多说了 ...
- cocos2dx 中使用的一些C++ 11 特性
0. placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...
- Windows多网卡上网设置
http://blog.tianya.cn/blogger/post_show.asp?BlogID=1566293&PostID=12984307
- PHPSTORM模板变量注释
类似于这种注释,方便使用. 有两种方式一种是生成PHP文件时,自动生成,一种是手动生成. 第一种:自动生成 一图解释所有.这么配置就OK了. 这种方法还有一种就是,在包括里边编写,直接引用,先写PHP ...
- Mybatis3.x与Spring4.x整合(转)
http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...
- C++ dynamic_cast对指针类型的转换
C8-3 三角形还是长方形? (100.0/100 points) 题目描述 在多态概念中,基类的指针既可以指向基类的对象,又可以指向派生类的对象.我们可以使用dynamic_cast类型转换操作符来 ...
- Struts2框架下表单数据的流向以及映射关系
本例框架很简单:默认页面为用户登录界面login.jsp,提交后由action类LoginAction.java来判断成功或失败,登录结果分别由success.jsp和failure.jsp呈现. 一 ...
- 临时解决系统中大量的TIME_WAIT连接
今天,偶然间发现后台服务与数据库之间有大量的TIME_WAIT的连接: [root@localhost logs]# netstat -an | grep TIME_WAIT tcp a.a.a.a: ...
- 帝国cms内容批量替换
方法一:栏目-其他相关-批量替换字段值 方法二:通过sql替换 UPDATE phome_ecms_news SET body=REPLACE(body,'原来','现在')
- VS 打开工程后 自动关闭
今天在打开一个VS2008的工程的时候,会提示vs2008 已停止工作的异常信息,具体的解决办法如下: 打开vs2008命令提示窗口: 打开窗口后:键入:devenv.exe /resetuserda ...