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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解Async/Await

發布時間:2023/12/4 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解Async/Await 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 5?Async/Await?語法特性,極大地簡化了異步編程,但我們知道,異步編程的基本原理并沒有發生根本改變。也就是說,當一些復雜的東西看起來很簡單時,它通常意味著有一些有趣的事情在背后發生。在計算機程序設計語言領域,我們把這些本身很復雜但看起來很簡單的語言特性稱為語法糖,通常情況下,我們并不需要深入理解語法糖是怎么被一層一層包裹起來的,但是,最近我在使用.NET Core實現MySQL協議過程中,需要實現一個Awaitable Socket,所以我需要知道Async/Await背后到底發上了什么?

編譯器重寫

我們通過寫一個非常簡單的控制臺應用程序,一層一層地剝開C#編譯器實現的?Async/Await?語法糖。

namespace AsyncAwaitInDepth{class Program{static void Main(string[] args){ }static async int Method(){return 1;}}}

編譯上面的C#代碼,會出現CS1983 The return type of an async method must be void, Task or Task<T>錯誤,即編譯器告訴我們,異步方法僅限于三個不同的返回類型︰

  • void

  • Task

  • Task

再修改一下代碼,讓編譯器編譯通過:

? ??}}

使用ILSpy或者Reflector看看編譯器干了什么:

上面的代碼可以發現,aynce/await?代碼被C#編譯器重寫了,編譯器通過使用三個Builder和動態生成的StateMachine替換掉了我們的代碼,而把我們的代碼整理到StateMachine的MoveNext()方法內部,三個Builder是:

  • AsyncVoidMethodBuilder

  • AsyncTaskMethodBuilder

  • AsyncTaskMethodBuilder

撇開這三個Builder的內部實現,從接口角度看,他們長得很像,我們只看看AsyncTaskMethodBuilder<T>接口:l


C#編譯器動態生成的StateMachine實現了IAsyncStateMachine接口:

  • AsyncVoidMethodBuilder

  • AsyncTaskMethodBuilder

  • AsyncTaskMethodBuilder

我們自己代碼中的await Task.Delay(5);表達式,在StateMachine的MoveNext()方法內部被替換成awaiter = Task.Delay(5).GetAwaiter();,然后通過IsCompleted屬性判斷是否需要啟動一個新的線程去執行,最后通過awaiter.GetResult();獲取結果,或者是給Builder設置異常builder.SetException(exception);

Awaitables and Awaiters

在.NET中,我們知道XtableXter是一個一對的概念,比如IEnumerable<T>和IEnumerator<T>,上面的代碼,我們發現Task,Task<TResult>是可以被awaited的,他們是awaitable,可以通過其GetAwaiter()方法得到awaiter:

awaitable的GetAwaiter()可以是實例方法,也可以是擴展方法。該方法返回的是一個awaiter,該awaiter必須實現INotifyCompletion接口,可選實現ICriticalNotifyCompletion接口,同時,必須提供一個名為IsCompleted?bool?屬性, 必須提供public TResult GetResult()方法。


自定義awaitableawaiter對象

我們費了那么大的勁,終于弄清楚了?Async/Await?背后到底發上了什么,做到了知其然知其所以然,因此,我們可以實現自己的awaitableawaiter對象:

最后,借用《C# in Depth》作者Job Skeet的一句話與大家共勉:

I like knowing how a feature works before I go too far using it

我們團隊正在招聘幾個小伙伴【招聘】騰訊(深圳)新增招聘互聯網金融.NET開發,我們是有追求的團隊,不滿足CRUD,我們探索.NET的深度技術,不僅僅是完成業務,我們追求極致,如果你也是這樣,歡迎加入我們。


原文地址:http://www.xyting.org/2017/02/28/understand-async-await-in-depth.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

贊賞

人贊賞

總結

以上是生活随笔為你收集整理的深入理解Async/Await的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧洲av一区二区三区 | 免费激情视频网站 | 国产情侣91| 看91| 成人黄色在线免费观看 | 国内精品卡一卡二卡三 | 69久久精品无码一区二区 | av在线高清观看 | 亚洲日本久久久 | 欧美精品xx| 日本高清有码 | 法国空姐在线观看免费 | 国产福利小视频 | 在线观看国产免费av | 亚洲黄色激情 | 国产精品高潮呻吟AV无码 | 特一级黄色片 | 成人做受视频试看60秒 | 日韩国产欧美综合 | 欧美老肥婆性猛交视频 | caopeng在线| 亚洲乱码精品 | 日韩激情影院 | 特级黄色一级片 | 视频一区二区国产 | 夜夜视频 | 亚洲欧美激情精品一区二区 | 熟妇高潮精品一区二区三区 | 女人张开腿让男人桶爽 | 性欧美一区二区 | 国产日韩视频 | 中国农村一级片 | 一级黄色片在线看 | 久久免费在线视频 | 丁香五色月 | 日本高清视频在线播放 | 青青草原成人 | 3d动漫精品啪啪一区二区下载 | 午夜电影网站 | 性欧美一区二区 | 欧美日韩有码 | 亚洲精品一级片 | 国产真实交换夫妇视频 | 不卡视频免费在线观看 | 欧美精品自拍偷拍 | 亚洲精品wwww | 成人av网站大全 | 亚洲精品无码成人 | 国产成人免费片在线观看 | 二级毛片| 黄色大片免费看 | 欧美破处大片 | 夜夜狠狠擅视频 | 色婷婷久久综合中文久久蜜桃av | 波多野结衣激情视频 | 欧美先锋影音 | 亚洲精品偷拍视频 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 99福利视频导航 | 国产一区二区三区四区精 | 国产大片中文字幕 | 色就是色av | 国产成人无码精品久久久久久 | 999xxxxx| 国产成人久久婷婷精品流白浆 | 精品视频第一页 | 一区二区在线免费视频 | 国产亚洲在线 | 1024久久 | 中文字幕在线免费视频 | 国产免费二区 | av新天堂 | 三级自拍视频 | 一区二区成人在线 | 激情在线网站 | 91福利视频在线观看 | 亚洲一区二区免费 | 欧美久久久久久久 | 久久成年人视频 | 亚洲天堂一区在线观看 | 国产一区一一区高清不卡 | 国产日韩久久 | 中文在线最新版天堂 | 黄色片免费观看 | 日韩区在线观看 | 日韩精品片 | 国产特级淫片免费看 | 国产精品美女久久久久av超清 | 伊人网综合视频 | 国产成人av免费看 | 超碰免费公开 | 欧美亚洲综合久久 | av网页在线观看 | 欧美精品一区三区 | 国自产拍偷拍精品啪啪一区二区 | jzzijzzij亚洲成熟少妇 | 国产美女av在线 | 秋葵视频污 | 九九九九色 |