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> ...
随机推荐
- React学习——ListView(Reflux)
接前一篇,把前面的ListView改成Reflux的形式 var BookActions=Reflux.createActions([ 'fetchList' ]); var BookStore = ...
- WordPress
WordPress: 1.一种使用PHP语言开发的博客平台 2.用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 3.也可以把 WordPress当作一个内容管理系统(CMS)来使用 ...
- Java的多态
多态的定义: 同一种行为,在不同对象上有不同的表现形式 实现多态的条件: 要有继承 要有方法的重写 要有父类的引用指向子类的对象 代码如下: public class Animal { String ...
- Ubuntu 16.04 64位安装insight 6.8
1. apt-get install insight已经不管用. 2. 编译源码死都有问题. 3. 拜拜,用KDBG.
- Maven构件解析(转)
文章转自http://gavinwind2000.iteye.com/blog/2290652 谢谢博主的总结! 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在 ...
- 浅谈JavaScript的作用域
前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好 ...
- Windows 10和Visual Studio 2015 能给.Net方向的开发从业者带来什么?
.Net 多年前我们选择了你,现在在当前的移动互联网热火朝天的时代,你能给我们什么样的惊喜?面对IOS和android的势头,windows的移动端能否实现三国鼎立? windows 10 号称统一各 ...
- HTML table、form表单标签的介绍
1. <table>标签 1.1说明: 在HTML 中定义表格布局. 1.2格式: <table> <caption></caption> <tr ...
- FreeBSD 配置
FreeBSD 配置 1. FreeBSD源代码下载站点:
- Nginx下css的链接问题
放在 Nginx 下的网页代码,在链接外部 css 文件时,可能出现没有链接成功的问题.需要在 nginx.conf 里的 http 下添加一行. http { include mime.types;