单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都是糊里又糊涂。

  首先感谢下这位仁兄的解读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 、异步回调的更多相关文章

  1. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  2. C# 异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  3. C# 1.0 新特性之异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  4. C#线程通信与异步委托

    线程的通知机制 AutoResetEvent是线程实现通知操作的重要方法.通常,AutoResetEvent用于通知正在等待线程已发生事件,允许线程通过发信号互相通信. AutoResetEvent时 ...

  5. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  6. c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别

    如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...

  7. C# 创建线程的简单方式:异步委托 .

    定义一个委托调用的方法:TakesAWhile //定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.Writ ...

  8. [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别

    如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...

  9. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

随机推荐

  1. Vector和ArrayList的比较

    今天研究了一下Vector和ArrayList的源码,又加深了对这两个类的理解. List接口下一共实现了三个类:ArrayList,Vector,LinkedList.LinkedList就不多说了 ...

  2. cocos2dx 中使用的一些C++ 11 特性

    0.  placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...

  3. Windows多网卡上网设置

    http://blog.tianya.cn/blogger/post_show.asp?BlogID=1566293&PostID=12984307

  4. PHPSTORM模板变量注释

    类似于这种注释,方便使用. 有两种方式一种是生成PHP文件时,自动生成,一种是手动生成. 第一种:自动生成 一图解释所有.这么配置就OK了. 这种方法还有一种就是,在包括里边编写,直接引用,先写PHP ...

  5. Mybatis3.x与Spring4.x整合(转)

    http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...

  6. C++ dynamic_cast对指针类型的转换

    C8-3 三角形还是长方形? (100.0/100 points) 题目描述 在多态概念中,基类的指针既可以指向基类的对象,又可以指向派生类的对象.我们可以使用dynamic_cast类型转换操作符来 ...

  7. Struts2框架下表单数据的流向以及映射关系

    本例框架很简单:默认页面为用户登录界面login.jsp,提交后由action类LoginAction.java来判断成功或失败,登录结果分别由success.jsp和failure.jsp呈现. 一 ...

  8. 临时解决系统中大量的TIME_WAIT连接

    今天,偶然间发现后台服务与数据库之间有大量的TIME_WAIT的连接: [root@localhost logs]# netstat -an | grep TIME_WAIT tcp a.a.a.a: ...

  9. 帝国cms内容批量替换

    方法一:栏目-其他相关-批量替换字段值 方法二:通过sql替换           UPDATE phome_ecms_news SET body=REPLACE(body,'原来','现在')

  10. VS 打开工程后 自动关闭

    今天在打开一个VS2008的工程的时候,会提示vs2008 已停止工作的异常信息,具体的解决办法如下: 打开vs2008命令提示窗口: 打开窗口后:键入:devenv.exe /resetuserda ...