天天看點

.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執行後結果如下

.Net 4.5 異步程式設計初試(async和await)

通過執行結果可以很明顯的看出,調用的同步方法裡面是順序執行的,而在異步方法中不一樣,當通過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的學習暫時就這麼多,皮毛的皮毛,不過暫時已經足夠了,等有時間了可以再深入的進行研究。