时间:2014-01-29 来源:

.NET中基于事件的异步模式-EAP

前言
在C# 5.0中符合w3c标准,新增了async await 2个关键字支持异步编程的操作.在讲述这两个关键字之前,符合w3c标准我先总结一下.NET中的常见的异步编程模型.
异步编程一直是比较复杂的问题,html切图其中要处理多线程之间的数据同步、获取进度、可取消、获取结果、不影响主线程操作、多个任务之间互相不影响等,jpg或psd转html因此需要设计编程模型去处理此类问题.

从.NET 4.5开始,网页切图价格Event-based Asynchronous Pattern)
异步编程模型(APE,Task-based Asynchronous Pattern)
目前新版的.NET是偏向于建议使用TAP方式进行异步编程web切图报价,WINRT中的异步操作就只有TAP的身影,网站div+cssasync await关键字也只是支持TAP的编程模型.

基于事件的异步模式 - EAP
EAP的编程模式的代码有以下特点:
将有一个或多个名为 “[方法名称]Async” 的方法.这些方法可能会创建同步版本的镜像符合w3c标准,这些同步版本会在当前线程上执行相同的操作.
该类还可能有一个 “[方法名称]Completed” 事件,符合w3c标准监听异步方法的结果.
它可能会有一个 “[方法名称]AsyncCancel”(或只是 CancelAsync)方法网页外包接活, object userState);
public event Method1CompletedEventHandler Method1Completed;
public void Method2Async(double param);
public void Method2Async(double param, object userState);
public event Method2CompletedEventHandler Method2Completed;
public void CancelAsync(object userState);
public bool IsBusy { get; }
// Class implementation not shown.
}

这里虚构的 AsyncExample 类有两个方法,div+css制作都支持同步和异步调用.同步重载的行为类似于方法调用承接网页制作,它们对调用线程执行操作;如果操作很耗时,承接网页制作则调用的返回可能会有明显的延迟.异步重载将在另一个线程上启动操作web切图报价,然后立即返回,web切图报价允许在调用线程继续执行的同时让操作“在后台”执行.
System.Net.WebClient 本身就有很多EAP的例子符合w3c标准,以它的DownloadString为例,html切图制作WebClient中跟DownloadString相关的方法有
DownloadString:同步下载字符串资源的方法网页外包接活,此方法阻塞当前线程.
DownloadStringAsync:使用EAP异步编程模式下载字符串资源的方法,网页外包接活此方法不会阻塞当前线程.
DownloadStringCompleted:响应异步下载时完成的事件.
DownloadProgressChanged:响应异步下载时进度变化.
调用模型示例如下
复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
namespace AsyncTest1.EAP
{
public class EAPRunTest1
{
public static void AsyncRun() {
Utility.Log("AsyncRun:start");
//测试网址
string url = "http://sports.163.com/nba/";
using (WebClient webClient = new WebClient()) {
//监控下载进度
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
//监控完成情况
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 += "|cancel=" + e.Cancelled.ToString() ;
if (e.Error != null)
{
//出现异常,手机前端外包就记录异常
log += "|error=" + e.Error.Message;
}
else {
//没有出现异常承接网页制作, DownloadProgressChangedEventArgs e)
{
Utility.Log("AsyncRun:download_progress|percent=" + e.ProgressPercentage.ToString());
}
}
}

运行结果
2012-12-28 00:39:39:621 AsyncRun:start
2012-12-28 00:39:40:377 AsyncRun:download_start
2012-12-28 00:39:40:903 AsyncRun:download_progress|percent=1
2012-12-28 00:39:40:933 AsyncRun:download_progress|percent=3
2012-12-28 00:39:40:933 AsyncRun:download_progress|percent=5
2012-12-28 00:39:40:934 AsyncRun:download_progress|percent=5
2012-12-28 00:39:40:975 AsyncRun:download_progress|percent=9
2012-12-28 00:39:41:068 AsyncRun:download_progress|percent=21
2012-12-28 00:39:41:131 AsyncRun:download_progress|percent=29
2012-12-28 00:39:41:182 AsyncRun:download_progress|percent=37
2012-12-28 00:39:41:298 AsyncRun:download_progress|percent=50
2012-12-28 00:39:41:354 AsyncRun:download_progress|percent=58
2012-12-28 00:39:41:447 AsyncRun:download_progress|percent=74
2012-12-28 00:39:41:489 AsyncRun:download_progress|percent=82
2012-12-28 00:39:41:582 AsyncRun:download_progress|percent=100
2012-12-28 00:39:41:582 AsyncRun:download_progress|percent=100
2012-12-28 00:39:41:614 AsyncRun:download_completed|cancel=False|result_size=205568
点击次数:3881
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日C++华为OJ求解二叉树的宽度(队列实现) 【综合】2015年07月10日pig使用tez引擎OutOfMemoryError【移动开发】2015年02月28日动态申请和释放一个二维数组 【综合】2015年02月27日WebService实时接口实现思路?【综合】2014年11月24日JQuery选择器 【编程语言】2015年01月12日利用IM.js逐像素比对图片 ,,2016年07月24日LNMP系列教程之SSL安装WordPress博客(程序下载与安装)2014年01月30日半透明的下拉菜单特效2014年01月28日改变ActionBar右侧三个小点的颜色【编程语言】2015年03月12日【c语言】输出一个图形【编程语言】2015年04月24日单片机编程:让led数码管显示数字0到9【编程语言】2015年05月12日三菱PLC串口通信开发心得经验 【编程语言】2015年01月26日UVA11235--Frequentvalues+RMQ问题 【移动开发】2015年07月03日HDOJ3948TheNumberofPalindromes回文串自动机【移动开发】2015年04月17日netinsertinto语法错误详解2014年01月29日hdu2682很水的最小生成树 【综合】2015年04月01日SSH开发中解决mysql数据库的乱码问题 【Web前端】2014年12月09日codeforces557EAnnandHalf-Palindrome【Web前端】2015年07月21日HDU1754Ihateit【线段树--单点更新,区间最值】 【Web前端】2015年03月27日图像滤镜艺术--暴雨滤镜 【编程语言】2014年12月01日简单的php文件上传(实例)2014年01月29日200.NumberofIslandsLeetcodePython 【编程语言】2015年04月17日在tomcat下部署工程方式 【移动开发】2015年01月21日使用操作系统命令来trace监听 【编程语言】2015年09月01日几种典型的设计模式【编程语言】2015年05月25日Cocos2dx开发windowsphone时,VS2013设置为横屏竖屏问题 【编程语言】2015年05月07日现代化的JVM语言Kotlin?build-1.1.0-dev-3584发布 ,,2016年10月06日input链接页面、打开新网页等等的具体实现2014年01月29日关于学习Flex的一点建议(转载)2014年01月29日CentOS6.4安装配置LAMP服务器(Apache+PHP5+MySQL)2014年01月30日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)