- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.NET中的异步编程-EAP/APM使用方法及案例介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
从.NET 4.5开始,支持的三种异步编程模式: •基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) •异步编程模型(APM,Asynchronous Programming Model) •基于任务的编程模型(TAP,Task-based Asynchronous Pattern) 基于任务的异步模式 (TAP) 是基于 System.Threading.Tasks 命名空间的 Task 和 Task<TResult>,用于表示任意异步操作。 TAP 是新开发的建议异步设计模式,之后再讨论。 先总结一下旧有的2种模式:EAP、APM。 从以下几个方面,看这2种异步编程方式的异同: •命名、参数、返回值 •典型应用 •捕获异常 •状态 •取消操作 •进度报告 EAP 命名、参数、返回值 EAP的编程模式的代码命名有以下特点: •将有一个或多个名为 “[方法名称]Async” 的方法。这些方法可能会创建同步版本的镜像,这些同步版本会在当前线程上执行相同的操作。 •该类还可能有一个 “[方法名称]Completed” 事件,监听异步方法的结果。 •它可能会有一个 “[方法名称]AsyncCancel”(或只是 CancelAsync)方法,用于取消正在进行的异步操作。 参数和返回值都没有特殊规定,按照业务需求而定 典型应用 以请求一个Url为例 。
复制代码代码如下
public class EAP_Typical { public static void AsyncRun() { Utility.Log("AsyncRun:start"); //测试网址 string url = http://sports.163.com/nba/; using (WebClient webClient = new WebClient()) { //获取完成情况 webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); webClient.DownloadStringAsync(new Uri(url)); Utility.Log("AsyncRun:download_start"); } } static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { string log = "AsyncRun:download_completed"; //获取返回结果 log += "|result_size=" + Utility.GetStrLen(e.Result); Utility.Log(log); } } 。
捕获异常 异常信息一般在Completed的事件参数中传递的。紧接上面的例子,如果需要获取返回的异常信息,则需要改写一下DownloadStringComleted的方法。 。
复制代码代码如下
static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { string log = "AsyncRun:download_completed"; if (e.Error != null) //可见,在事件的参数传输异常信息 { //出现异常,就记录异常 log += "|error=" + e.Error.Message; } else { //没有出现异常,则记录结果 log += "|result_size=" + Utility.GetStrLen(e.Result); } Utility.Log(log); } 。
状态 EAP本身并没有维护状态,如果需要的话,应该设置不同的时间响应不同的状态改变; 假设刚才的DownloadStringAsync,需要增加多几个状态值,可以考虑增加多几个事件。 如 Event DownloadStringStarted(响应下载刚开始) Event DownloadStringPending(响应下载阻塞中) Event DownloadStringCancel(响应下载取消时) 等等。 取消操作 按命名规范,如果操作对应有“[方法名称]AsyncCancel”(或只是 CancelAsync)方法,则支持取消操作。 取消的状态捕获,还是以刚才的下载Url输出html为例,还是在DownloadStringCompleted 获取取消与否的状态。DownloadStringCompletedEventArgs. Cancelled 注意的是,如果用户执行了CancelAsync后,在DownloadStringCompletedEventArgs.Error就会获取到对应的异常,此时不要再取DownloadStringCompletedEventArgs.Result。 进度报告 EAP没有硬性规定说要支持进度报告,但可以很顺其自然地通过时间响应进度变化。 以当前例子,WebClient 就提供了DownloadProgressChanged 做进度变化的响应事件。 APM 命名、参数、返回值 APM的编程模式的代码命名有以下特点: •使用 IAsyncResult 设计模式的异步操作是通过名为[Begin操作名称] 和 [End操作名称] 的两个方法来实现的,这两个方法分别开始和结束异步操作 操作名称。 例如,FileStream 类提供 BeginRead 和 EndRead 方法来从文件异步读取字节。 这两个方法实现了 Read 方法的异步版本。 •在调用 [Begin操作名称] 后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行。 每次调用 [Begin操作名称] 时,应用程序还应调用 [End操作名称] 来获取操作的结果。 典型应用 以请求一个Url为例 。
复制代码代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; namespace AsyncTest1.APM { public class APMTestRun1 { public static void AsyncRun() { Utility.Log("APMAsyncRun:start"); //测试网址 string url = "http://sports.163.com/nba/"; HttpWebRequest webRequest = HttpWebRequest.Create(url) as HttpWebRequest; webRequest.BeginGetResponse(Callback, webRequest); Utility.Log("AsyncRun:download_start"); } private static void Callback(IAsyncResult ar) { var source = ar.AsyncState as HttpWebRequest; var response = source.EndGetResponse(ar); using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { string content = reader.ReadToEnd(); Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content)); } } } } } 。
委托的异步调用也用的是APM模式,这个方式的强大之处,在于可以使任何方法编程异步调用。 。
复制代码代码如下
/// <summary> /// 一个耗时的方法 /// </summary> private static void CaluateManyNumber() { for (int i = 0; i < 10; i++) { Thread.Sleep(100); Console.WriteLine("loop==>"+i.ToString()); } } /// <summary> /// 委托,让耗时方法可以异步执行 /// </summary> public static void AsyncDelegate() { //委托简单的包装了一下方法 Action action = CaluateManyNumber; action.BeginInvoke(DelegateCallback, null); Console.WriteLine("action begin"); } /// <summary> /// 异步回调 /// </summary> /// <param name="ar"></param> private static void DelegateCallback(IAsyncResult ar) { AsyncResult asyncResult = ar as AsyncResult; var delegateSource = asyncResult.AsyncDelegate as Action; delegateSource.EndInvoke(ar); Console.WriteLine("action end"); } 。
捕获异常 异常信息要在[End操作名称]中获取。 。
复制代码代码如下
private static void Callback(IAsyncResult ar) { var source = ar.AsyncState as HttpWebRequest; WebResponse response = null; try { response = source.EndGetResponse(ar); } catch (Exception ex) { Utility.Log("error:" + ex.Message); response = null; } if (response != null) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { string content = reader.ReadToEnd(); Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content)); } } } } 。
状态和取消操作、进度报告 APM模式本身不支持状态多样化和取消操作、进度报告.
最后此篇关于.NET中的异步编程-EAP/APM使用方法及案例介绍的文章就讲到这里了,如果你想了解更多关于.NET中的异步编程-EAP/APM使用方法及案例介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题在这里已经有了答案: Oracle: merging two different queries into one, LIKE & IN (1 个回答) 8年前关闭。 我有以下代码: case
我查阅过此页面:http://dev.mysql.com/doc/refman/5.1/en/case.html以及这个,但无法获得一个简单的程序来工作...... 更新:为了明确我想要做什么:我想从
有什么办法可以优化下面的查询吗? SELECT DATE_FORMAT(a.duedate,'%d-%b-%y') AS dte, duedate, SUM(CASE WHEN (typeofnoti
我进退两难,以下 SQL 查询的结果是什么以及它是如何工作的: SELECT ... CASE WHEN (a.FIELD=1 AND b.FIELD=2) THEN 1 WHEN
问题:输入年,月,打印对应年月的日历。 示例: 问题分析: 1,首先1970年是Unix系统诞生的时间,1970年成为Unix的元年,1970年1月1号是星期四,现在大多的手机的日历功能只能显
**摘要:**介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题。 本
我想拥有自动伴侣类apply case 类的构造函数来为我执行隐式转换,但无法弄清楚如何这样做。我到处搜索,我能找到的最接近的答案是 this问题(我将解释为什么它不是我在下面寻找的)。 我有一个看起
您好,我已经浏览了“多列案例”问题,但没有看到与此相同的内容,所以我想我应该问一下。 基本上我有两个我想要连接的表(都是子查询的结果)。它们具有相同的列名称。如果我加入他们的 ID 和 SELECT
我发现了一些类型推断的非直觉行为。因此,语义等效代码的工作方式不同,具体取决于编译器推断出的有关函数返回类型的信息。当您在最小单元测试中重现此案例时,或多或少会清楚发生了什么。但我担心在编写框架代码时
CREATE TABLE test ( sts_id int , [status1] int , [status2] int , [status3] int , [status4] int ) INS
我有以下声明: SELECT Dag AS Dag, CASE Jaar WHEN 2013 THEN Levering END AS '2013', CASE
我想做的是为所有高于平均时间、平均时间和低于平均时间的游乐设施获取平均tip_portion。所以返回3行。当我运行它时,它显示: ERROR: missing FROM-clause entry
我正在尝试设置一个包含以下字段的报告: 非常需要报告来显示日期、该日期内的总记录(因此我按日期分组),然后按小时计算 12 小时工作日(从上午 8 点到晚上 8 点)我需要计算记录在这些时间内出现的时
我有这个查询 SELECT users.name FROM users LEFT JOIN weapon_stats ON users.id = weapon_stats.zp_id WHERE we
我正在尝试按收视率等级获取不同视频的计数。我有下表: vid_id views 1 6 1 10 1 900 2 850 2 125000
假设我有一个如下所示的 SQL 语句: select supplier, case when platform in (5,6) then 'mobile' when p
我有一个表测试 TestNumber (int primary key) InactiveBitwise (int) 我执行以下命令: UPDATE tests SET CASE WH
我有一个像这样的表(name=expense): id amount date 1 -1687 2014-01-02 00:00:00.0 2 11000 2014-01-02 0
我有一个 multimap 定义 typedef std::pair au_pair; //vertices typedef std::pair acq_pair; //ch qlty specifi
我有一个有点像枚举的类,它的每个实例都有一个唯一的 int 值,该值从 0 开始并在每个新实例时递增。 class MyEnumLikeClass { static int NextId =
我是一名优秀的程序员,十分优秀!