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

首頁 > 學院 > 開發(fā)設計 > 正文

.NET異步編程初識async與await

2019-11-17 02:46:23
字體:
供稿:網(wǎng)友

.NET異步編程初識async與await

這是兩個關(guān)鍵字,用于異步編程。我們傳統(tǒng)的異步編程方式一般是Thread、ThreadPool、BeginXXX、EndXXX等等。把調(diào)用、回調(diào)分開來,代碼的邏輯是有跳躍的,于是會導致思路不是很清晰的問題,在.NET 4.5中,新推出的async、await關(guān)鍵字,可以幫助我們像寫同步方法一樣去寫異步方法(保證代碼的整齊清晰)。

  先來看個傳統(tǒng)同步方法例子:

 1         static void Main(string[] args) 2         { 3             // 同步方式 4             Console.WriteLine("同步方式測試開始!"); 5             SyncMethod(0); 6             Console.WriteLine("同步方式結(jié)束!"); 7             Console.ReadKey(); 8         } 9 10         // 同步操作11         PRivate static void SyncMethod(int input)12         {13             Console.WriteLine("進入同步操作!");14             var result = SyancWork(input);15             Console.WriteLine("最終結(jié)果{0}", result);16             Console.WriteLine("退出同步操作!");17         }18 19         // 模擬耗時操作(同步方法)
20         private static int SyancWork(int val)21         {22             for (int i = 0; i < 5; ++i)23             {24                 Console.WriteLine("耗時操作{0}", i);25                 Thread.Sleep(100);26                 val++;27             }28             return val;29         }

  可以從右圖中看到執(zhí)行結(jié)果,是非常典型的同步執(zhí)行方法。

  async關(guān)鍵字能用在方法、lambda表達式的聲明部分,用來標示此方法可能包含await關(guān)鍵字,只有擁有async才能在其內(nèi)部使用await關(guān)鍵字。異步方法可以具有Task、Task<>或void的返回類型;await關(guān)鍵字則是用于返回值是“可等待”類型(awaitable)的方法或lambda表達式內(nèi),“awaitable”可以是任何類型(常見的有Task、Task<>),它必須公開一個GetAwaiter()方法并且返回有效的”awaiter”。更詳細的信息可以參考“關(guān)于Async與Await的FAQ”,里面介紹了這些概念與注意事項。

  當一個async方法,且內(nèi)部包含await關(guān)鍵字,它就會在編譯的時候成為一個異步方法,如果沒有await關(guān)鍵字,則它將只會被當成一個同步方法來執(zhí)行。如果對其內(nèi)部實現(xiàn)感興趣可以參考“異步性能:了解 Async 和 Await 的成本”一文,相信對深入了解這種機制還是有所幫助的。

  現(xiàn)在我們嘗試使用新出的異步關(guān)鍵字async、await來改造成異步調(diào)用:

static void Main(string[] args)
        {            // 異步方式            Console.WriteLine("/n異步方式測試開始!");            AsyncMethod(0);            Console.WriteLine("異步方式結(jié)束!");            Console.ReadKey();         }          // 異步操作        private static async void AsyncMethod(int input)        {            Console.WriteLine("進入異步操作!");            var result = await AsyncWork(input);            Console.WriteLine("最終結(jié)果{0}", result);            Console.WriteLine("退出異步操作!");        }        // 模擬耗時操作(異步方法)
        private static async Task<int> AsyncWork(int val)        {            for (int i = 0; i < 5; ++i)            {                Console.WriteLine("耗時操作{0}", i);                await Task.Delay(100);                val++;            }            return val;        }

  先來看結(jié)果吧,我們發(fā)現(xiàn)耗時操作已經(jīng)是異步進行了。整體流程大概是先由Main函數(shù)異步調(diào)用AsyncMethod,并不等待AsyncMethod完成,繼續(xù)往下執(zhí)行。而AsyncMethod方式在被調(diào)用后,在分配到時間片時開始啟動,執(zhí)行函數(shù)體內(nèi)容,并由于await AsyncWork語句而繼續(xù)異步調(diào)用AsyncWork,但由于await關(guān)鍵字,將在此等待AsyncWork完成后,再繼續(xù)往下執(zhí)行。那么,AyncWork也一樣的,被調(diào)用后,在分配到時間片時開始啟動,執(zhí)行耗時操作。

  可以看到,使用了新的關(guān)鍵字后,同步與異步編程的語法差別進一步減少。隨著.NET 4.5的推出,許多新類庫和既有類庫都支持這種新型的異步語法(比如HttpClient、HttpServer、MemoryStream...),它們以類似ReadAsync、WriteAsync、SendAsync等分開方法來提供具有async聲明,且返回類型為Task、Task<>的異步工作方式。

  補充:

  剛才有朋友提到await Task.Delay(100)這條語句,這是為了讓AsyncWork成為異步方法才加的,如果你要進行的操作不支持await修飾怎么辦,其實很簡單,使用Task.Factory.StartNew()就行了,舉例:

 1         // 異步操作 2         private static async void AsyncMethod(int input) 3         { 4             Console.WriteLine("進入異步操作!"); 5             var result = await Task.Factory.StartNew((Func<object, int>)SyncWork2, input); 6             Console.WriteLine("最終結(jié)果{0}", result); 7             Console.WriteLine("退出異步操作!"); 8         } 9 10         // 模擬耗時操作(同步方法)11         private static int SyncWork2(object input)12         {13             int val = (int)input;14             for (int i = 0; i < 5; ++i)15             {16                 Console.WriteLine("耗時操作{0}", i);17                 Thread.Sleep(100);18                 val++;19             }20             return val;21         }

  這樣,我們的SyncWork2實際上卻是異步執(zhí)行的,所得結(jié)果與前面的異步方法一致,只是這樣一來輸入?yún)?shù)只能是object類型,需要進行類型轉(zhuǎn)化。另外,除了StartNew,我們還可以新建一個Task,然后調(diào)用Run,以完成同樣效果。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武义县| 高要市| 景宁| 棋牌| 特克斯县| 兴海县| 揭西县| 颍上县| 平凉市| 曲阜市| 绥芬河市| 广安市| 城步| 仲巴县| 哈尔滨市| 漳浦县| 锦州市| 南平市| 石首市| 永兴县| 随州市| 保德县| 和林格尔县| 鹤山市| 广州市| 哈巴河县| 龙川县| 洛南县| 灌南县| 利津县| 黄龙县| 商洛市| 双流县| 登封市| 昆山市| 黄大仙区| 曲靖市| 阳泉市| 山东省| 汾阳市| 永州市|