在前面一篇博文记录了C# APM异步编程的知识,今天再来分享一下EAP(基于事件的异步编程模式)异步编程的知识。后面会继续奉上TPL任务并行库的知识,喜欢的朋友请持续关注哦。

EAP异步编程算是C#对APM的一种补充,让异步编程拥有了一系列状态事件。如果你看过本系列的前一篇文章《C# 异步编程1 APM 异步程序开发》,并假设你是微软C#语言开发组的一员,现在让你来设计基于事件的异步编程模式。那你是会利用之前的APM进行改造?还是进行再次创造呢?所以当你对相关dll进行反编译,会惊喜的发现EAP实际上是对APM增加了事件event后的封装。因此这篇博文的篇幅不会很长,我们只介绍EAP模式的基本信息和编程实现。对于事件 event 我后续增加博文阐述其功能及用法。

EAP 基于事件的异步编程模式

当我们使用EAP模式进行异步编程时,需要满足以下2个条件:

1、要进行异步的方法其方法名应该以XXXAsync结尾

2、要有一个名为XXXCompleted的事件监听异步方法的完成

3、可增加一个CancelAsync方法用于取消正在执行的异步方法(可选)

示例代码:

    /// <summary>
/// EAP是对APM的封装
/// </summary>
public class Worker
{
public enum WorkerStatus
{
Cancel = ,Running=, Completed=
}
public class WorkerEventArgs :EventArgs
{
public WorkerStatus Status { get; set; }
public string Message { get; set; }
} public Worker()
{
}
public event EventHandler<WorkerEventArgs> OnWorkCompleted;
IAsyncResult asyncResult = null;
Thread thread = null;
public void WorkAsync()
{
Worker _this = this; Action action = () =>
{
thread = Thread.CurrentThread;
Thread.Sleep(1);
Console.WriteLine(string.Format("线程:{0},Work Over.", Thread.CurrentThread.ManagedThreadId)); };
asyncResult = action.BeginInvoke((result) =>
{
WorkerEventArgs e = null;
try
{
action.EndInvoke(asyncResult);
}
catch (ThreadAbortException ex)
{
e = new WorkerEventArgs() { Status = WorkerStatus.Cancel, Message = "异步操作被取消" };
}
if (null != _this.OnWorkCompleted)
{
_this.OnWorkCompleted.Invoke(this, e);
}
}, this);
} public void CancelAsync()
{
if (null != thread)
thread.Abort();
}
}

调用程序使用WinForm来进行,示例代码如下(仅为演示用):

        Worker worker;
private void Btn_Start_Click(object sender, EventArgs e)
{
worker = new Worker();
worker.OnWorkCompleted += WorkOver;
worker.WorkAsync();
Console.WriteLine(string.Format("线程:{0}", Thread.CurrentThread.ManagedThreadId));
}
private void Btn_Cancel_Click(object sender, EventArgs e)
{
worker.CancelAsync();
}
private void WorkOver(object sender, Worker.WorkerEventArgs e)
{
if (null != e)
{
if (Worker.WorkerStatus.Cancel == e.Status)
{
MessageBox.Show(e.Message);
}
}
else
{
Console.WriteLine(string.Format("线程:{0},委托回调完成.", Thread.CurrentThread.ManagedThreadId));
}
}

效果展示:

注意事项(重要):

1、APM异步编程时,因异步代码执行在单独的线程中,异步代码中出现的异常应该在调用EndXXX时捕获。

2、EAP异步编程时,因上述同样原因,代码中的异常信息会被传递到Completed事件的EventArgs参数中。

EAP(基于事件的异步编程模式)核心内容并不多,并且如网路、IO等耗时类 Ms 已添加了EAP相关异步功能,我们直接拿来用就好。尤其是后续TPL并行任务的加入,用户自定义EAP异步功能的机会更是了了,但EAP中相关的知识点如线程、委托、事件等仍然是重要的.......................

TPL任务并行库正在快马加鞭赶来中...............

C# 异步编程2 EAP 异步程序开发的更多相关文章

  1. 二、基于事件的异步编程模式(EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...

  2. 异步编程(二)基于事件的异步编程模式 (EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进 ...

  3. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  4. php为什么需要异步编程?php异步编程的详解(附示例)

    本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我对 php 异步的知识还比较混乱,写这篇是为了 ...

  5. C# 异步编程1 APM 异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  6. Asp.Net异步编程-使用了异步,性能就提升了吗?

    Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...

  7. 异步编程:IAsyncResult异步编程模型 (APM)

    http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html

  8. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  9. 【憩园】C#并发编程之异步编程(一)

    写在前面 C#5.0中,对异步编程进行了一次革命性的重构,引入了async和await这两个关键字,使得开发人员在不需要深刻了解异步编程的底层原理,就可以写出十分优美而又代码量极少的代码.如果使用得当 ...

随机推荐

  1. 4.Apache Spark的工作原理

    Apache Spark的工作原理 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark ...

  2. if else 和switch case以及continue,break的区别

    1,if 经常用于做区间判断 或者 固定值: break和continue的使用        break:用来结束循环结构或者switch case        continue:结束此次循环进入 ...

  3. Python+Selenium+webdriver环境搭建(windows)以及相关资源下载链接

    今天记录一下测试小菜鸟alter在测试入门的一点关于python+Selenium+webdriver环境搭建的经历以及资源分享.欢迎交流学习,批评指正. 一.Python的下载与安装 1.pytho ...

  4. 21. leetcode 492

    492: 给定一个面积值,求它的长l和宽w.长和宽需满足:长大于等于宽,长和宽的差值尽可能小,长乘宽等于面积. 思路:先将l和w初始化为sqrt(area),然后看l*w是否等于面积,如果等于则返回l ...

  5. 玛雅游戏[NOIP2011]

    题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  6. CSS样式----浮动(图文详解)

    标准文档流 宏观地讲,我们的web页面和photoshop等设计软件有本质的区别:web页面的制作,是个"流",必须从上而下,像"织毛衣".而设计软件,想往哪里 ...

  7. 解决百度BMR的spark集群开启slaves结点的问题

    前言 最近一直忙于和小伙伴倒腾着关于人工智能的比赛,一直都没有时间停下来更新更新我的博客.不过在这一个过程中,遇到了一些问题,我还是记录了下来,等到现在比较空闲了,于是一一整理出来写成博客.希望对于大 ...

  8. Lightoj1205——Palindromic Numbers(数位dp+回文数)

    A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the sam ...

  9. 用jlink在mini2440上烧写uboot

    首先,附上我安装jlink驱动: http://download.csdn.net/detail/zzmno1/3776716#comment 以及我使用的uboot.bin文件下载地址: http: ...

  10. zyUpload---照片上传并显示效果

    demo 下载连接