zoukankan      html  css  js  c++  java
  • .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#简典
  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3442332.html
Copyright © 2011-2022 走看看