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

首頁 > 學院 > 開發設計 > 正文

談談c#中異步編程模型的變遷

2019-11-14 13:45:48
字體:
來源:轉載
供稿:網友

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

BeginXXX,EndXXX模式

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

這種模型的基本流程是:

  1. 調用BeginXXX方法
  2. BeginXXX方法中傳入一個回調方法,這個回調方法會在異步方法執行結束后被執行
  3. 調用EndXXX方法,使用EndXXX方法會阻塞當前線程,直到異步方法返回結果。

我們看一個FileStream的示例方法,在.Net 2.0中,你需要這樣使用異步:

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中可以這樣實現:

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方法來實現新的異步模型。Task本身比回調方法靈活了許多,可以更優雅的實現回調,取消,調度等操作。關于Task的使用方式可以看我之前總結的文章link。

async和await模型

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

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);        }    }}

關于異步編程模型的兼容性

如果大家注意看BCL中的類庫,會發現微軟并沒有在最新版本的類庫中對每一個BeginXXX的方法都添加了XXXAsync方法。這種情況下我們如何能讓新的異步模型兼容舊的方法呢?

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

    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);    }

  

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

  1. 不返回Task對象的調用方法+回調方法的模型
  2. 返回Task對象的XXXAsync模型,和async,await模型

BeginXXX模型微軟已經逐漸的考慮廢棄,返回Task的異步編程模型目前是微軟建議的方式。

  


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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵阳市| 绿春县| 宿松县| 鄂伦春自治旗| 望城县| 德兴市| 通州市| 彭水| 连城县| 永胜县| 沙湾县| 塔河县| 鹤壁市| 万载县| 容城县| 虎林市| 阿鲁科尔沁旗| 察隅县| 黔西| 河南省| 赤峰市| 九龙城区| 托克托县| 旺苍县| 新蔡县| 原平市| 德庆县| 西乌珠穆沁旗| 仙居县| 井研县| 托里县| 屏山县| 巫山县| 黄平县| 宁明县| 岳阳市| 鹤壁市| 玛曲县| 天长市| 荆州市| 宾川县|