C#每天进步一点--异步编程模式
C#可以有一个简单易用的机制用于异步执行方法,那就是委托。下面我介绍三种模式,对于这三种模式来说,原始线程都发起了一个异步方法,然后做一些其他处理。然而这些模式不同的是,原始线程获取发起的线程已经完成的消息的方式。
1:在等待一直到完成(wait-nutil-done)模式。
在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续。
class Program
{
private delegate int MyDel(int a); public static int MyMenthod(int a)
{
for (int i = 0; i < 1000; i++)
{
a++;
}
return a;
} static void Main(string[] args)
{
var del = new MyDel(MyMenthod);
Console.WriteLine("Before BeginInvoke");
IAsyncResult iar = del.BeginInvoke(5, null, null);
Console.WriteLine("After BeginInvoke"); Console.WriteLine("Doing stuff"); long result = del.EndInvoke(iar); Console.WriteLine("结果为{0}",result);
}
}
运行结果为

2:轮询模式(polling)。
原始线程定期检查发起的线程是否完成,如果没有则可以继续做其他的事情。上代码
class Program
{
private delegate int MyDel(int a); public static int MyMenthod(int a)
{
for (int i = 0; i < 1000; i++)
{
a++;
}
Thread.Sleep(3000);
return a;
} static void Main(string[] args)
{
var del = new MyDel(MyMenthod); IAsyncResult iar = del.BeginInvoke(5,null,null);
Console.WriteLine("After BeginInvoke"); while (!iar.IsCompleted)
{
Console.WriteLine("还没处理完"); Thread.Sleep(2000);
Console.WriteLine("继续处理其他事情");
}
Console.WriteLine("异步执行完成");
long result = del.EndInvoke(iar);
Console.WriteLine("结果为{0}",result);
}
}
运行结果为:

3:回调模式(callbacl)。
原始线程一直执行,无需等待或检查发起的线程是否完成,在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用EndInvoke之前处理异步方法的结构。上代码
class Program
{
private delegate int MyDel(int a); public static int MyMenthod(int a)
{
for (int i = 0; i < 1000; i++)
{
a++;
}
return a;
}
public static void CallBack(IAsyncResult iar)
{
AsyncResult ar = iar as AsyncResult;
MyDel del = (MyDel)ar.AsyncDelegate;
long r = del.EndInvoke(iar);
Thread.Sleep(2000);
Console.WriteLine("结果出来了,为{0}", r);
}
static void Main(string[] args)
{
var del = new MyDel(MyMenthod); Console.WriteLine("After BeginInvoke");
IAsyncResult iar= del.BeginInvoke(5, CallBack, del); Console.WriteLine("Doing More Work In Main");
Thread.Sleep(5000);
}
}
运行结果为:

回调方法的签名和返回类型必须和AsyncCallbacl委托类型所描述的形式一致。它需要方法接受一个IAsyncResult作为参数并且返回类型是void,如下:
void AsyncCallback(IAsyncResult iar)
我们有多种方式可以为BeginInvoke方法提供回调方法,由于BeginInvoke中的callback参数是AsyncCallback类型的委托,我们可以以委托形式提供,我们也可以只提供回调方法名称,让编译器为我们创建委托,两种形式是等价的。
IAsyncResult iar1 = del.BeginInvoke(5,new AsyncCallback(CallWhenDone),null);
IAsyncResult iar2 = del.BenginInvoke(5,CallWhenDone,null);
C#每天进步一点--异步编程模式的更多相关文章
- C#多线程和异步(三)——一些异步编程模式
一.任务并行库 任务并行库(Task Parallel Library)是BCL中的一个类库,极大地简化了并行编程,Parallel常用的方法有For/ForEach/Invoke三个静态方法.在C# ...
- .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)
本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...
- C#中的异步编程模式
异步编程模型(APM) 基于事件的异步编程模式 基于任务的异步模式 Async Await编程 关于C#,可以看看Learning Hard的博客
- 二、基于事件的异步编程模式(EAP)
一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...
- 基于任务的异步编程模式,Task-based Asynchronous Pattern
术语: APM 异步编程模型,Asynchronous Programming Model,其中异步操作由一对 Begin/End 方法(如 FileStream.BeginRea ...
- [.net 多线程]异步编程模式
.NET中的异步编程 - EAP/APM 从.NET 4.5开始,支持的三种异步编程模式: 基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) 异 ...
- 基于任务的异步编程模式(TAP)的错误处理
在前面讲到了<基于任务的异步编程模式(TAP)>,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不能捕获到异步方法中的异常.因为在异步方法执行出现 ...
- 基于任务的异步编程模式(TAP)
异步编程是C#5.0的一个重要改进,提供两个关键字:async和await.使用异步编程,方法的调用是在后台运行(通常在线程或任务的帮助下),但不会阻塞调用线程.异步模式分为3种:异步模式.基于事件的 ...
- 异步编程(二)基于事件的异步编程模式 (EAP)
一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进 ...
随机推荐
- Linux下用GCC
Linux下用GCC 前言 离职前对做过的支付系统进行了一番#总结,继续完善我的C服务器. 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问 ...
- Android studio怎么创建Android虚拟机?
进行Android studio中进行开发app应用的情况,如果在进行调式app的应用的情况下,没有真机手机机器是没有办法调式的,那么只能通过Android studio中sdk提供虚拟机进行调式ap ...
- oracle 10g提升cluster失败
一个今天升级10g集群环境到10.2.0.5.下载补丁p8202632_10205_Linux-x86-64.zip,解压安装并运行后.中途岛错误: I/O ERROR cannt reading o ...
- DDD实战9 经销商领域上下文
1.创建Dealer.Domain 类库项目 2.创建实体和值对象 3.安装ef的包 4.创建上下文接口(IDealerContext)之所以要创建上下文接口,是为了可替换,在其他项目总使用接口,当需 ...
- hann function
hann function 是一种离散型窗函数,定义如下: w(n)=12(1−cos(2πnN−1))=sin2(πnN−1) 窗口的长度为 L=N+1; hann function 以及其傅里叶响 ...
- 楼塔当天领袖acm心理(作为励志使用)
楼主个人博客:吉尔博客 假期空闲的时候使用.这些年来GCJ.ACM,TopCoder 的一个号码的一重要的比赛的参与 回顾.GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前.我 ...
- 构建自己的PHP框架(Twig模板引擎)
完整项目地址:https://github.com/Evai/Aier Twig 模板引擎 模版引擎 twig 的模板就是普通的文本文件,也不需要特别的扩展名,.html .htm .twig 都可以 ...
- google 搜索结果在新标签中打开
google->setting->search setting->Where results open->检查
- MySql 5.7 重置root密码
一.以安全模式登录 # Stop MySQL sudo service mysql stop # Make MySQL service directory. sudo mkdir -p /var/ru ...
- C++使用libcurl做HttpClient(业务观摩,用C++封装过程式代码,post和get的数据,最好url编码,否则+会变成空格)good
当使用C++做HTTP客户端时,目前通用的做法就是使用libcurl.其官方网站的地址是http://curl.haxx.se/,该网站主要提供了Curl和libcurl.Curl是命令行工具,用于完 ...