日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】谈谈c#中异步编程模型的变迁**

發(fā)布時間:2023/12/10 C# 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】谈谈c#中异步编程模型的变迁** 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家在編程過程中都會用到一些異步編程的情況。在c#的BCL中,很多api都提供了異步方法,初學(xué)者可能對各種不同異步方法的使用感到迷惑,本文主要為大家梳理一下異步方法的變遷以及如何使用異步方法。

BeginXXX,EndXXX模式

在.Net Framework 2.0中,最常見的方法是BeginXXX,和EndXXX這樣的方法來搭配使用。這種模式可以概括為方法+回調(diào)函數(shù)模式或者稱為InvokeMethod+EventHandler模式。

這種模型的基本流程是:

  • 調(diào)用BeginXXX方法
  • BeginXXX方法中傳入一個回調(diào)方法,這個回調(diào)方法會在異步方法執(zhí)行結(jié)束后被執(zhí)行
  • 調(diào)用EndXXX方法,使用EndXXX方法會阻塞當前線程,直到異步方法返回結(jié)果。
  • 我們看一個FileStream的示例方法,在.Net 2.0中,你需要這樣使用異步:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    using?System;

    using?System.IO;

    using?System.Text;

    ?

    public?class?AsyncTest

    {

    ????public?static?void?Main(string[] args)

    ????{

    ????????using?(FileStream file =?new?FileStream("Test.txt", FileMode.OpenOrCreate))

    ????????{

    ????????????var?bytes = Encoding.UTF8.GetBytes("Test for .net framework 2.0");

    ?

    ????????????IAsyncResult asyncResult = file.BeginWrite(bytes, 0, bytes.Length, callback,?null);

    ?

    ????????????file.EndWrite(asyncResult);

    ????????}

    ?

    ????????Console.ReadLine();

    ????}

    ?

    ????private?static?void?callback(IAsyncResult ar)

    ????{

    ????????Console.WriteLine("Finish Write");

    ????}

    }

    XXXAsync模式

    從.Net 4.0開始,微軟引入了Task。由于Task本身的靈活性,也使得我們的異步編程模型更簡潔。上面的例子在.Net 4.5中可以這樣實現(xiàn):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    using?System;

    using?System.IO;

    using?System.Text;

    using?System.Threading.Tasks;

    ?

    public?class?AsyncTest

    {

    ????public?static?void?Main(string[] args)

    ????{

    ????????using?(FileStream file =?new?FileStream("Test.txt", FileMode.OpenOrCreate))

    ????????{

    ????????????var?bytes = Encoding.UTF8.GetBytes("Test for .net framework 4.5");

    ?

    ????????????var?task = file.WriteAsync(bytes, 0, bytes.Length);

    ?

    ????????????task.Wait();

    ????????}

    ?

    ????????Console.ReadLine();

    ????}

    }

    微軟在許多BCL的api中都添加了XXXAsync方法來實現(xiàn)新的異步模型。Task本身比回調(diào)方法靈活了許多,可以更優(yōu)雅的實現(xiàn)回調(diào),取消,調(diào)度等操作。關(guān)于Task的使用方式可以看我之前總結(jié)的文章link。

    async和await模型

    為了進一步簡化異步模型,微軟從Visual Studio 2012開始引入了async和await關(guān)鍵字。這個模型本身是基于編譯器的一個語法糖,編譯后會生成一個statemachine模型。這樣上面例子中的寫法也可以簡化成:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    using?System;

    using?System.IO;

    using?System.Text;

    using?System.Threading.Tasks;

    ?

    public?class?AsyncTest

    {

    ????public?static?void?Main(string[] args)

    ????{

    ????????TestFunc();

    ????}

    ?

    ????private?static?async?void?TestFunc()

    ????{

    ????????using?(FileStream file =?new?FileStream("Test.txt", FileMode.OpenOrCreate))

    ????????{

    ????????????var?bytes = Encoding.UTF8.GetBytes("Test for .net framework 4.5");

    ????????????await file.WriteAsync(bytes, 0, bytes.Length);

    ????????}

    ????}

    }

    關(guān)于異步編程模型的兼容性

    如果大家注意看BCL中的類庫,會發(fā)現(xiàn)微軟并沒有在最新版本的類庫中對每一個BeginXXX的方法都添加了XXXAsync方法。這種情況下我們?nèi)绾文茏屝碌漠惒侥P图嫒菖f的方法呢?

    以NamedPipeServerStream為例,這個類庫實現(xiàn)了一個管道的功能,微軟并沒有為其更新XXXAsync方法,你可以使用TaskFactory來兼容新的異步模型,你可以這樣來實現(xiàn):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    private?static?void?OldAsyncModel()

    {

    ????NamedPipeServerStream pipe =?new?NamedPipeServerStream("customPipe", PipeDirection.InOut, -1, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough);

    ????IAsyncResult async = pipe.BeginWaitForConnection(callback,?null);

    ????pipe.EndWaitForConnection(async);

    }

    ?

    private?static?async?void?NewAsyncModel()

    {

    ????NamedPipeServerStream pipe =?new?NamedPipeServerStream("customPipe", PipeDirection.InOut, -1, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough);

    ?

    ????await Task.Factory.FromAsync(pipe.BeginWaitForConnection, pipe.EndWaitForConnection,?null);

    }

      

    因此,我們可以總結(jié)為,.Net中有兩種異步編程模型:

  • 不返回Task對象的調(diào)用方法+回調(diào)方法的模型
  • 返回Task對象的XXXAsync模型,和async,await模型
  • BeginXXX模型微軟已經(jīng)逐漸的考慮廢棄,返回Task的異步編程模型目前是微軟建議的方式。

    ??


    作者:獨上高樓
    出處:http://www.cnblogs.com/myprogram/
    本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權(quán)利。

    總結(jié)

    以上是生活随笔為你收集整理的【转】谈谈c#中异步编程模型的变迁**的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品高清无码在线观看 | 亚洲一区成人 | 黄色视屏在线 | 美女洗澡无遮挡 | 精品乱码一区二区三区 | 国产精品久久中文字幕 | 草草视频在线观看 | 福利网址在线 | 国产3p精品一区 | av在线免费播放网站 | 亚色91| 国产精品国产三级国产aⅴ中文 | 国产精品19p| 毛片毛片毛片毛片毛片毛片毛片 | 成年网站免费观看 | 亚洲黄色影视 | 亚洲一区二区三区色 | 中文有码视频 | 亚洲成年人av | 国产一区观看 | 在线观看日本一区二区 | 久久久欧洲 | 99毛片| 97日日夜夜 | 好吊妞无缓冲视频观看 | 国产精品jizz视频 | 美女搡bbb又爽又猛又黄www | 大号bbwassbigav女 | 久久福利国产 | 性开放网站 | 福利av在线 | 999精品在线观看 | 中文字幕蜜臀 | 亚洲一区二区在线观看视频 | 毛片成人 | 日韩欧美国产一区二区三区在线观看 | 一区二区中文字幕 | 91蝌蚪视频在线 | 久久综合激的五月天 | 9999国产精品 | 天天综合网天天综合色 | 91亚瑟视频| 国产白丝袜美女久久久久 | 欧美自拍色图 | www天天干 | 国产免费a级片 | 国产av成人一区二区三区 | 亚洲人妻一区二区三区 | 天天干夜夜怕 | 久草中文在线 | 国产精品视频久久久久久 | 欧美激情在线观看视频 | 开心激情综合网 | 日本三级中文字幕 | 久草在现 | 天天艹av| 中文字幕在线日亚洲9 | 亚洲精品久久久久久动漫器材一区 | 成人免费视频网址 | 天天干干天天 | 好妞色妞国产在线视频 | xxxx999| 成人性做爰aaa片免费 | 欧美人与动性xxxxx杂性 | 美日韩一区二区三区 | 国产色黄| 97久久久 | 三上悠亚在线一区 | 欧美成人精品在线 | 日本精品视频一区二区三区 | 日韩在线一区视频 | 日本不卡视频 | av黄色国产 | 午夜亚洲成人 | 夜夜添无码一区二区三区 | 国产免费又黄又爽又色毛 | 中文字幕第一页在线播放 | 国产激情一区二区三区在线观看 | 成人午夜激情影院 | 一区二区视频免费在线观看 | 欧美婷婷六月丁香综合色 | av香港经典三级级 在线 | 福利片在线看 | 精品国产一区二区三区久久久蜜月 | 亚洲精品久久久久久久久久久 | 免费无码肉片在线观看 | 国产又粗又硬又长又爽的演员 | 美国少妇在线观看免费 | 久久黄色小说 | 激情自拍偷拍 | 国产剧情一区在线 | 亚洲精品一区二区18漫画 | 成人福利在线看 | a国产免费 | 成人亚洲在线 | 苍井空浴缸大战猛男120分钟 | 国产日韩欧美精品 | 色天天干| 日韩精品一区二区三区在线播放 |