.NET 同步与异步之封装成Task(五)
本随笔续接:.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 : https://files.cnblogs.com/files/08shiyan/ParallelDemo.zip
参见更多:随笔导读:同步与异步
(未完待续...)