zoukankan      html  css  js  c++  java
  • .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 : http://files.cnblogs.com/files/08shiyan/ParallelDemo.zip

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


    (未完待续...)

  • 相关阅读:
    WDK中出现的特殊代码
    敏捷是怎样炼成的
    推荐一个非常好玩的falsh游戏
    软件安全技术
    J2EE的昨天,今天,明天
    Java打印程序设计
    关于父亲
    xml发展历史和用途
    CRM与ERP整合的六个切入点
    SEO(搜索引擎最佳化)简介
  • 原文地址:https://www.cnblogs.com/08shiyan/p/6165738.html
Copyright © 2011-2022 走看看