.NET 同步与异步之封装成Task(五)
2018-06-17 21:55:43来源:未知 阅读 ()
本随笔续接:.NET 实现并行的几种方式(四)
前篇随笔已经介绍了几种可以实现并发的方式,其中异步方法、是最简便的方式。而 异步方式是基于 Task 和 async修饰符和await运算符实现的。
换句话说:如果我们有了Task、就有了异步方法。
在随笔:.NET 实现并行的几种方式(二) 中,已经简单的介绍了 Task.Run(); 利用Task.Run();我们可以很轻松的将同步代码封装成Task。
如果我们想封装异步代码呢?比如 : APM 和 EAP。.NET已经为我们提前准备好了工具:
1、封装APM
/// <summary> /// 封装APM /// </summary> public void Demo4() { var response = GetResponse("http://www.cnblogs.com/08shiyan"); // ... } private Task<WebResponse> GetResponse(string url) { var request = WebRequest.CreateHttp(url); request.Method = "GET"; return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null); }
2、封装EAP
/// <summary> /// 封装EAP /// </summary> public void Demo5() { var result = GetResult("http://www.cnblogs.com/08shiyan"); // ... } private Task<string> GetResult(string url) { TaskCompletionSource<string> source = new TaskCompletionSource<string>(); WebClient webClient = new WebClient(); webClient.DownloadStringCompleted += (sender, args) => { if (args.Cancelled) { source.SetCanceled(); return; } if (args.Error != null) { source.SetException(args.Error); return; } source.SetResult(args.Result); }; webClient.DownloadStringAsync(new Uri(url), null); return source.Task; }
3、封装成Task的终极武器:TaskCompletionSource
TaskCompletionSource :按照我的理解,它是Task的灵活实现者、它可灵活控制Task的取消、异常、和正常完成,并通过属性公开Task.
利用它我们可以像封装EAP一样、封装人任何代码。
附,Demo : http://files.cnblogs.com/files/08shiyan/ParallelDemo.zip
参见更多:随笔导读:同步与异步
(未完待续...)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP7中I/O模型内核剖析详解 2019-10-08
- PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql 2019-09-23
- 如何解决mysql主从数据库不同步 2019-08-09
- Mysql-MariaDB设置延迟同步 2019-07-24
- Mysql 主从报错:1141 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash