• .Net 4.5 异步编程初试(async和await)


    .Net 4.5 异步编程初试(async和await)

    前言

      最近自己在研究Asp.Net Web API。在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过,所以就稍微的学习了解一下。这两篇文章是:

    Calling a Web API From a .NET Client (C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

    Calling a Web API From a WPF Application(C#) http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-application

         关于异步编程的简单理解:

        在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单。通过特性可以将这项复杂的工作交给编译器来完成了。之前传统的方式来实现异步编程较为复杂,这样对于程序猿来说处理起来比较困难,调试也没那么方便,后续的维护工作也比较痛苦。

       Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework 或 Windows Runtime的资源创建一个异步方法如同创建一个同步方法一样容易。

       这里还有两篇是我之前对多线程简单学习的入门

       http://www.cnblogs.com/aehyok/archive/2013/05/02/3054615.html

     http://www.cnblogs.com/aehyok/archive/2013/05/02/3055524.html

      接下来通过VS2013 创建一个基于.NET4.5的控制台应用程序进行尝试。

    简单示例

     先直接把简单的代码贴出来,如下所示

    复制代码
            /// <summary>
            /// 同步方法打印Hello World
            /// </summary>
            public static void PrintHelloWorld()
            {
                Console.WriteLine("同步方法调用开始");
                Console.WriteLine("同步方法:Hello World");
                Thread.Sleep(1000);
                Console.WriteLine("退出同步方法");
            }
    
            /// <summary>
            /// 异步方法打印Hello World
            /// </summary>
            public async static void AsyncPrintHelloWorld()
            {
                Console.WriteLine("异步方法调用开始");
                Console.WriteLine("异步方法:Hello World");
                await Task.Delay(1000);
                Console.WriteLine("退出异步方法");
            }
    复制代码

    上面注释中也有进行说明,第一个是同步方法,第二个是异步方法。同步方法可以通过Thread.Sleep(1000);暂停方法执行1000ms,同样的异步方法可以通过await Task.Delay(1000)来处理,而且在异步方法的声明中要加入async的关键字。

    接下来是简单的调用

    复制代码
            static void Main(string[] args)
            {
                Console.WriteLine("======同步方法调用=====");
                PrintHelloWorld();
                Console.WriteLine("同步方法调用结束");
    
                Console.WriteLine("======异步方法调用=====");
                AsyncPrintHelloWorld();
                Console.WriteLine("异步方法调用结束");
                Console.ReadLine();
            }
    复制代码

    F5执行后结果如下

    通过执行结果可以很明显的看出,调用的同步方法里面是顺序执行的,而在异步方法中不一样,当通过Task.Delay(1000)暂停当前方法的时候,其方法外面的下面的方法会继续执行,也就是打印“异步方法调用结束”的语句。

    可以发现使用了关键字之后,同步与异步的语法差别很小。随着.NET4.5的推出,许多类库和已有类库都将支持这种新型的异步语法,比如我正在学习的HTTPClient等等。

    进一步说明

     上面的演示只是通过简单的void的方法进行演示的,当然肯定可以带上返回值的额。

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Async
    {
        class Program
        {
            static void Main(string[] args)
            {
                var ret = AsyncAdd("累死了,真想不出啥好的例子来调用");
                Console.WriteLine(ret.Result);
                Console.ReadLine();
            }
                
    
            ///异步打印传入的字符串
            public async static Task<string> AsyncAdd(string str)
            {
                string result = await PringString(str);
                return result;
    
            }
    
            public async static Task<string> PringString(string str)
            {
                return "Hello World" + str;
            }
        }
    }
    复制代码

    通过运行其实和同步的是一样的,只不过看看如何来定义异步方法的返回值,根据Task<T>来进行定义。

    如果指定Task<TResult>为返回结果,那么这个方法必须包含return指定的TResult结果的语句。

    一个async方法里通常包含一个或多个的对应的await操作符,但如果没有await表达式也不会导致编译错误。但如果调用一个async方 法,却不使用await关键字来标记一个挂起点的话,程序将会忽略async关键字并以同步的方式执行

    总结

     1.一个异步方法的声明中必然包含一个async的修饰符。

     2.异步方法的方法名可以以“Async”结尾。

     3.Task<TResult> 当你的方法有返回值时,那么TResult即返回值的类型

     4.方法通常至少包含一个await表达式。

    关于async和await的学习暂时就这么多,皮毛的皮毛,不过暂时已经足够了,等有时间了可以再深入的进行研究。

     
     
    分类: C#
    标签: C# 线程C#简典
  • 相关阅读:
    路由器设置无线网的方法
    numpy, pandas, matplotlib等常用库的学习手册
    文本乱码的解决办法
    漫画:SOA中怎样确定服务的粒度?
    漫画:大公司都在重复造轮子吗?
    演讲稿:新人培养之道
    漫画:全面理解java.lang.IllegalArgumentException及其可用性设计
    漫画:性能、可用性和锁
    漫画:Linux中/etc/resolv.conf文件和puppet工具解析
    《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3442332.html
Copyright © 2020-2023  润新知