.NET 同步与异步之封装成Task(五)
2023-09-14 08:56:59 时间
本随笔续接:.NET 实现并行的几种方式(四)
前篇随笔已经介绍了几种可以实现并发的方式,其中异步方法、是最简便的方式。而 异步方式是基于 Task 和 async修饰符和await运算符实现的。
换句话说:如果我们有了Task、就有了异步方法。
在随笔:.NET 实现并行的几种方式(二) 中,已经简单的介绍了 Task.Run(); 利用Task.Run();我们可以很轻松的将同步代码封装成Task。
如果我们想封装异步代码呢?比如 : APM 和 EAP。.NET已经为我们提前准备好了工具:
1、封装APM
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <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
参见更多:随笔导读:同步与异步
(未完待续...)
相关文章
- .NET 同步与异步 之 EventWaitHandle(Event通知) (十三)
- .NET 同步与异步 之 Mutex (十二)
- .NET 同步与异步 之 线程安全的集合 (十一)
- .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
- .NET 同步与异步之锁(Lock、Monitor)(七)
- ASP .NET CORE 部署linux 系统上的所需要的sdk 使用链接
- dbMigration .NET 数据同步迁移工具
- .NET(C#) Internals: as a developer, .net framework in my eyes
- Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
- ASP.NET MVC 随想录
- 从执行上下文角度重新理解.NET(Core)的多线程编程[2]:同步上下文
- [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步
- [ASP.NET Core 3框架揭秘] 配置[2]:读取配置数据[下篇]
- ASP.NET Core的路由[5]:内联路由约束的检验
- 通过几个Hello World感受.NET Core全新的开发体验
- ASP.NET Core的配置(5):配置的同步[设计篇]
- ASP.NET Core的配置(5):配置的同步[ 实例篇]
- 常见掌握类库与工具体系图 艾提拉总结 Atitit 文档资料处理重要类库与工具体系树 Configuration yml xml jsoup Net apache commons net
- Atitit ..Net Framework sdk 3.0 3.5 4.04.5 4.6 4.7 .net core版本新特性 v2 s22 1. 新特性来源于 down ms 官方网站1
- ASP.NET Web Pages - PHP
- ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
- .net多线程,线程异步,线程同步,并发问题---1---ShinePans
- .NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write
- Net Core 微服务 - 如何在docker容器里运行一个简单的.net core web api 服务
- EasyXLS Professional Excel 8.6.1 for .NET
- Golang net/http包
- .NET中Invoke和BeginInvoke