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为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进 ...
随机推荐
- C#实现拼图游戏
C#实现<拼图游戏> (下) 原理篇 前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游 ...
- 集装箱set相关算法
set_union 算法set_union可构造S1.S2的并集.此集合内含S1或S2内的每个元素. S1.S2及其并集都是以排序区间表示.返回值是一个迭代器.指向输出区间的尾端. 因为S1和S ...
- hadoop 集群及hbase集群的pid文件存放位置
一.当hbase集群和hadoop集群停了做一些配置调整,结果执行stop-all.sh的时候无法停止集群, 提示no datanode,no namenode等等之类的信息, 查看stop-all. ...
- 【Struts2学习笔记(4)】指定需要Struts 2请求后缀的常量定义复杂的过程
一.指定需要Struts 2请求后缀处理 我们是在违约前.action后缀访问Action. 事实上默认后缀是通过不断"struts.action.extension"进行更改.例 ...
- Android Handler、Message完全解析,带你从源码的角度彻底理解
之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...
- Callable,Runnable异同
1.Runnable和Callable的区别 (1) Callable规定的方法是 call(), Runnable规定的方法是 run(). (2) Callable的任务执行后可返回值,而 Run ...
- Network Function Virtualization for a Network Device
An apparatus for performing network function virtualization (NFV), comprising: a memory, a processor ...
- TCP 报文段结构
源端口.目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信.源端口.目标端口是用 ...
- 工具:sql server profiler(分析器)
打开profiler新建->连接数据库进行监测 任何访问该数据库的都有记录 image 对于linq的检验:sql实际如何->运行程序,查看分析器记录 image ...
- Template简介
分类 ControlTemplate ItemsPanelTemplate DataTemplate 样式Style和模板Template对比 Style:样式,风格Template:模版,某种控 ...