从.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模式本身不支持状态多样化和取消操作、进度报告。
相关推荐:
seo自己做什么,自己做seo需要花钱吗 ,ai850775
整理文章的AI:提升写作效率的智能助手
SEO努力:提升网站排名的关键策略,网站建设微企动力
seo网站关键字排名优化,网站seo关键词 ,运动ai
WP原创:打造属于你的独特网站,从这里开始!,一个网站推广一个月需要多少钱
AI免费生成:释放创造力的秘密武器
SEO表格:优化网站排名的秘密武器,大数据推广营销费用多少
ChatGPT无法加载?检查您的网络设置并尝试重启ChatGPT,助您畅享无障碍智能对话体验,ai记录人
优化收费,助力企业提升效益,实现共赢,宜州餐饮网站建设
二SEO是什么,h二seo三是什么 ,ai手术机
ChatGPT暂时不可用?如何高效应对并寻找最佳替代方案!,logo ai教程视频
SEO那么重要,企业如何通过它脱颖而出?,自媒体推广营销的概念
SEO基础知识解析:如何提升网站排名,助力企业成长,毕节企业建设网站
AI人工智能:改变未来的科技革命
为什么关键词太少会影响你的网络营销效果?,陕西seo网站推广工具
seo系列什么意思,seo的分类 ,que n ai je
seo要寻找什么资源,怎么找seo ,ai插画描边
SEO全站优化:打造强大网站排名的必备利器,AI论文写作的优点
什么是seo技术,什么是seo及seo的作用 ,AI倒放仓鼠
SEO优化如何为网站做好关键词研究和优化,ai直通
seo需要什么能力,seo需要哪些技术 ,ai长条弯曲
SEO大量优化:如何通过精准策略提升网站流量,突破搜索引擎排名瓶颈,吕梁本地网站推广平台
seo网站排名优化哪家好,seo网站优化平台 ,ai斗蟋
seo种草什么意思,seo yoo na ,三维地震反演AI
seo该从什么开始,seo是什么时候开始的 ,ai写作免费英文怎么说
SEO怎么做才能提升网站流量与排名?这篇文章给你全攻略,铁岭定制网站推广公司电话
SEO通过-如何通过SEO优化让你的业务在搜索引擎中脱颖而出,保定网站建设推广专家
在线AI生成文章:智能写作的未来趋势
SEO运营是什么职业,seo运营工程师招聘 ,把ai图层改横幅
ChatGPT3.5最新版:智能对话新纪元,带你进入AI的未来世界,ai苔藓生长
为什么做抖音seo,为什么做抖音推广 ,描边ai虚线
常用AI工具,高效智能生活
seo需要干什么,seo需要具备什么知识 ,ai梦境档案世岛大宅
SEO实际:如何在竞争激烈的市场中脱颖而出,dz论坛seo如何设置
SEO需要什么语音,seo需要考虑什么 ,学生作业ai
AI优化文章:如何利用人工智能提升写作效率和质量
SEO发明:引领数字时代营销革命的力量,速卖通外贸推广网站
SEO项目:如何通过精确优化提升企业网站排名与转化率,武汉做网站优化的公司
seo网页优化什么意思,seo网站优化必知的10个问答,问吧,【解决】百度不知道 ,ai识别点读机
SEO优化排名原理解析:如何提高网站排名,实现精准流量获取,奥迪ai售价
AI生成文章免费工具,让创作变得轻松又高效,ai安心健
怎么分辨文章是不是AI写的?五大技巧揭开真相
SEO学费多少钱?揭秘SEO培训的投资价值与回报!,郴州网站推广多少钱一个
AI免费生成文章让创作变得轻松自如
SEO领站-从零到一打造成功网站排名的秘密,轻淘客seo怎设置
SEO实现:如何通过SEO优化提升网站流量与排名,南京市公司网站推广
线上AI写作免费一键生成,轻松提升写作效率,解放创作思维
从“官网扒下来”看企业数字化转型的未来,摄影营销策略推广文案
企业SEO:如何通过搜索引擎优化提升企业网络竞争力,安阳网站优化布局设计
SEO量:提升网站流量和排名的关键法则,德兴seo