.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);
        }
封装APM
复制代码

 

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;
        }
封装EAP
复制代码

 

3、封装成Task的终极武器:TaskCompletionSource  

TaskCompletionSource :按照我的理解,它是Task的灵活实现者、它可灵活控制Task的取消、异常、和正常完成,并通过属性公开Task.

利用它我们可以像封装EAP一样、封装人任何代码。

 

附,Demo : https://files.cnblogs.com/files/08shiyan/ParallelDemo.zip

参见更多:随笔导读:同步与异步


(未完待续...)

 

posted @   把爱延续  阅读(1403)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示