国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

.net4.5使用async和await異步編程實(shí)例

2020-01-24 02:59:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

關(guān)于異步編程的簡(jiǎn)單理解:

在.NET4.5中新增了異步編程的新特性async和await,使得異步編程更為簡(jiǎn)單。通過(guò)特性可以將這項(xiàng)復(fù)雜的工作交給編譯器來(lái)完成了。之前傳統(tǒng)的方式來(lái)實(shí)現(xiàn)異步編程較為復(fù)雜,這樣對(duì)于程序猿來(lái)說(shuō)處理起來(lái)比較困難,調(diào)試也沒(méi)那么方便,后續(xù)的維護(hù)工作也比較痛苦。

Async和Await關(guān)鍵字是C#異步編程的核心。通過(guò)使用這兩個(gè)關(guān)鍵字,你可以使用.NET Framework 或 Windows Runtime的資源創(chuàng)建一個(gè)異步方法如同創(chuàng)建一個(gè)同步方法一樣容易。

接下來(lái)通過(guò)VS2013 創(chuàng)建一個(gè)基于.NET4.5的控制臺(tái)應(yīng)用程序進(jìn)行嘗試。

先直接把簡(jiǎn)單的代碼貼出來(lái),如下所示

復(fù)制代碼 代碼如下:

/// <summary>
        /// 同步方法打印Hello World
        /// </summary>
        public static void PrintHelloWorld()
        {
            Console.WriteLine("同步方法調(diào)用開(kāi)始");
            Console.WriteLine("同步方法:Hello World");
            Thread.Sleep(1000);
            Console.WriteLine("退出同步方法");
        }

        /// <summary>
        /// 異步方法打印Hello World
        /// </summary>
        public async static void AsyncPrintHelloWorld()
        {
            Console.WriteLine("異步方法調(diào)用開(kāi)始");
            Console.WriteLine("異步方法:Hello World");
            await Task.Delay(1000);
            Console.WriteLine("退出異步方法");
        }

上面注釋中也有進(jìn)行說(shuō)明,第一個(gè)是同步方法,第二個(gè)是異步方法。同步方法可以通過(guò)Thread.Sleep(1000);暫停方法執(zhí)行1000ms,同樣的異步方法可以通過(guò)await Task.Delay(1000)來(lái)處理,而且在異步方法的聲明中要加入async的關(guān)鍵字。

接下來(lái)是簡(jiǎn)單的調(diào)用

復(fù)制代碼 代碼如下:

static void Main(string[] args)
        {
            Console.WriteLine("======同步方法調(diào)用=====");
            PrintHelloWorld();
            Console.WriteLine("同步方法調(diào)用結(jié)束");

            Console.WriteLine("======異步方法調(diào)用=====");
            AsyncPrintHelloWorld();
            Console.WriteLine("異步方法調(diào)用結(jié)束");
            Console.ReadLine();
        }

F5執(zhí)行后結(jié)果如下

通過(guò)執(zhí)行結(jié)果可以很明顯的看出,調(diào)用的同步方法里面是順序執(zhí)行的,而在異步方法中不一樣,當(dāng)通過(guò)Task.Delay(1000)暫停當(dāng)前方法的時(shí)候,其方法外面的下面的方法會(huì)繼續(xù)執(zhí)行,也就是打印“異步方法調(diào)用結(jié)束”的語(yǔ)句。

可以發(fā)現(xiàn)使用了關(guān)鍵字之后,同步與異步的語(yǔ)法差別很小。隨著.NET4.5的推出,許多類庫(kù)和已有類庫(kù)都將支持這種新型的異步語(yǔ)法,比如我正在學(xué)習(xí)的HTTPClient等等。

上面的演示只是通過(guò)簡(jiǎn)單的void的方法進(jìn)行演示的,當(dāng)然肯定可以帶上返回值的額。

復(fù)制代碼 代碼如下:

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("累死了,真想不出啥好的例子來(lái)調(diào)用");
            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;
        }
    }
}

通過(guò)運(yùn)行其實(shí)和同步的是一樣的,只不過(guò)看看如何來(lái)定義異步方法的返回值,根據(jù)Task<T>來(lái)進(jìn)行定義。

如果指定Task<TResult>為返回結(jié)果,那么這個(gè)方法必須包含return指定的TResult結(jié)果的語(yǔ)句。

一個(gè)async方法里通常包含一個(gè)或多個(gè)的對(duì)應(yīng)的await操作符,但如果沒(méi)有await表達(dá)式也不會(huì)導(dǎo)致編譯錯(cuò)誤。但如果調(diào)用一個(gè)async方 法,卻不使用await關(guān)鍵字來(lái)標(biāo)記一個(gè)掛起點(diǎn)的話,程序?qū)?huì)忽略async關(guān)鍵字并以同步的方式執(zhí)行

總結(jié)

1.一個(gè)異步方法的聲明中必然包含一個(gè)async的修飾符。

 2.異步方法的方法名可以以“Async”結(jié)尾。

 3.Task<TResult> 當(dāng)你的方法有返回值時(shí),那么TResult即返回值的類型

 4.方法通常至少包含一個(gè)await表達(dá)式。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 固阳县| 湖南省| 西平县| 丰原市| 富裕县| 贺兰县| 怀来县| 徐州市| 辽中县| 蒙城县| 双柏县| 新平| 栾城县| 会宁县| 西乌| 凤庆县| 桐乡市| 绿春县| 巴楚县| 进贤县| 长寿区| 平山县| 铁力市| 临澧县| 沧州市| 宜兴市| 永济市| 苗栗县| 册亨县| 绥宁县| 镇赉县| 安国市| 广东省| 宜都市| 乌海市| 保康县| 沂南县| 湘潭县| 汨罗市| 上蔡县| 晋中市|