C#异步编程的实现方式(1)——异步委托
异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它。 .Net Framework已经为我们提供了委托的异步调用方法。下面介绍三种使用委托实现异步的方法。
1、投票(IsCompleted属性)
首先定义一个委托:
1: public delegate string MyDelegate(int ms);
Delegate类提供了BeginInvoke()方法,这个方法返回一个IAsyncResult接口,这个接口包含了该委托的相关信息,并且可以通过它的IsCompleted属性来判断该委托是否执行完成。下面是将要异步调用的方法:
1: static string DelegateMethod(int ms)
2: {
3: Console.WriteLine("TakesAWhile started");
4: Thread.Sleep(ms);
5: Console.WriteLine("TakesAWhile completed");
6: return "Hello world!";
7: }
下面是主线程的方法:
1: static void Imp1()
2: {
3: MyDelegate dl = DelegateMethod;
4:
5: IAsyncResult ar = dl.BeginInvoke(5000, null, null);
6:
7: while (!ar.IsCompleted)
8: {
9: Console.Write(".");
10: Thread.Sleep(50);
11: }
12: string result = dl.EndInvoke(ar);
13: Console.WriteLine("result: {0}", result);
14: }
可以看到,委托线程执行5秒钟,主线程不停的循环判断委托线程是否完成(用IsCompleted属性判断)。如果没完成则断续打点,如果完成则跳出循环。用EndInvoke方法获取委托的返回值。如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。
2、等待句柄(AsyncWaitHandle属性)
使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:
1: static void Imp2()
2: {
3: MyDelegate dl = DelegateMethod;
4:
5: IAsyncResult ar = dl.BeginInvoke(5000, null, null);
6: while (true)
7: {
8: Console.Write(".");
9: if (ar.AsyncWaitHandle.WaitOne(50))
10: {
11: Console.WriteLine("Can get the result now");
12: break;
13: }
14: }
15: string result = dl.EndInvoke(ar);
16: Console.WriteLine("result: {0}", result);
17: }
1: static void Imp3()
2: {
3: MyDelegate dl = DelegateMethod;
4: dl.BeginInvoke(5000, new AsyncCallback(ar =>
5: {
6: string result = dl.EndInvoke(ar);
7: Console.WriteLine("result: {0}", result);
8: }), null);
9: for (int i = 0; i < 100; i++)
10: {
11: Console.Write(".");
12: Thread.Sleep(50);
13: }
14: }
http://www.cnblogs.com/sosowjb/archive/2012/08/10/2631161.html
转载于:https://www.cnblogs.com/jes_shaw/archive/2013/03/12/2956005.html
C#异步编程的实现方式(1)——异步委托相关推荐
- 异步编程的实现方式以及区别
1.异步编程的实现方式? JavaScript中的异步机制可以分为以下几种: ━ 回调函数的方式,使用回调函数的方式有一个缺点是,多个回调函数嵌套的时候会造成回调地狱,上下两层的回调函数间的代码耦合度 ...
- 【转】1.7异步编程:基于事件的异步编程模式(EAP)
传送门:异步编程系列目录-- 上一篇,我给大家介绍了".NET1.0 IAsyncResult异步编程模型(APM)",通过Begin*** 开启操作并返回IAsyncResult ...
- 深入理解python异步编程_深入理解Python异步编程
1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...
- rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio
1. 异步编程简介 通常我们将消息通信分成同步和异步两种: 同步就是消息的发送方要等待消息返回才能继续处理其它事情 异步就是消息的发送方不需要等待消息返回就可以处理其它事情 很显然异步允许我们同时做更 ...
- python3异步编程_协程 Python异步编程(asyncio)
协程(Coroutine) 也可以被称为微线程,是一种用户态内的上下文切换技术.简而言之,其实就是通过一个线程实现代码块相互切换执行. 直接上代码,例如: 同步编程 import time def f ...
- [转]C#异步编程的实现方式(1)——异步委托
异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它. .Net Framework已经为我们提供了委托的异步调用方法.下面介绍三种使用委托实现异步的方法. 1.投票(IsComplet ...
- C#异步编程的实现方式(4)——Task任务
.Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操作.使用任务不仅可以获得一个抽象层,还能对底层线程进行很多统一的控制操作 ...
- C#异步编程的实现方式(6)——层次任务
任务也可以构成一个层次结构.一个任务启动一个新任务时,就启动了一个层次结构.下面的代码段在父任务内部新建一个任务.创建子任务的代码与创建父任务的代码相同,唯一的区别是这个任务从另一个任务内部创建: 1 ...
- C#异步编程(一):异步基础
class Program{static void Main(string[] args){var result = DownloadStringWithTimeout("http://ww ...
最新文章
- 波段 ku_X和Ku波段小尺寸无线电设计
- H3C设备之RIP v2认证
- python每天定时9点执行_python 定时器每天就执行一次的实现代码
- python核心编程第六章练习6-12
- tuning-primer.sh 性能调试工具的使用
- springboot使用jsp完成数据的页面展示
- HTML5新增音频标签(HTML5)
- 江苏计算机二级vb,江苏省计算机等级考试二级vb.ppt
- 苹果手机壳_潮牌刺绣苹果8 Plus手机壳,让爱机焕然一新
- 2020-07-07
- WampServer 不能打开phpmyadmin 的解决办法
- java spark 项目_spark应用程序如何在Java项目中运行
- API Guides Contacts Provider
- 查看抽取解压缩和修改war包
- python计算器算法_Python数学运算入门把Python当作计算器
- c语言负数左移右移_C语言负数的移位运算
- IDEA中实现自动导包
- c语言社团管理系统实验报告,C语言课程设计大学社团管理系统
- aso优化师是什么_【aso优化师赵星凯】简述为什么要做aso?
- 2016年智能楼宇趋势展望
热门文章
- eclipse断点调试 出现Source not found
- 很棒的在线裁图工具jQuery1.4.2 + jquery.bitmapcutter.js + BitmapCutter.Core+的完美配合
- 在LINUX环境中,哪种文件系统存储更安全?
- ROS 2 index翻译(七)——用Colcon编译功能包(package)
- [转]12款最佳Linux命令行终端工具
- Nginx笔记系列(1)——Nignx的安装部署
- 《神探tcpdump第四招》-linux命令五分钟系列之三十八
- Mysql中NUMERIC和DECIMAL类型区别比较
- Buffer Cache Hit Ratio
- 浏览器本地存储的使用