C#異步編程ConfigureAwait的使用小結(jié)
異步編程是并發(fā)的一種形式,它有兩大好處:
- 對于面向終端用戶的GUI程序,提高了響應(yīng)能力
- 對于服務(wù)器端應(yīng)用,利用線程池實現(xiàn)了可擴展性
異步編程的兩個關(guān)鍵字:async
和await
。
需要注意:如果async
方法有返回值,應(yīng)返回Task<T>
;如果沒有返回值,應(yīng)返回Task
。
嚴(yán)重警告:不要用void
作為async
方法的返回類型!async
方法可以返回void
,但這僅限于編寫事件處理程序。一個普通的async
方法如果沒有返回值,要返回Task
,而不是void
。
有了上述背景知識,我們來快速看一個例子:
async Task DoSomethingAsync() { int val = 13; //以同步方式執(zhí)行 // 異步方式等待1秒 await Task.Delay(TimeSpan.FromSeconds(1)); val *= 2; // 異步方式等待1秒 await Task.Delay(TimeSpan.FromSeconds(1)); Trace.WriteLine(val); }
上述代碼,DoSomethingAsync方法在最開始時,以同步方式執(zhí)行。當(dāng)遇到await
時,如果這個異步等待操作沒有完成,就暫停DoSomethingAsync方法并返回這個Task
,當(dāng)這個Task
完成操作后,繼續(xù)以同步方式執(zhí)行后續(xù)的代碼。
問題:如果在UI線程中調(diào)用DoSomethingAsync,這個方法的每個同步程序塊都將在此UI線程上運行。怎么避免這種錯誤行為呢?這就用到了await
中的ConfigureAwait
方法。
async Task DoSomethingAsync() { int val = 13; //以同步方式執(zhí)行 // 異步方式等待1秒 // 將continueOnCapturedContext參數(shù)設(shè)為false,則會在線程池線程里繼續(xù)運行 await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false); val *= 2; // 異步方式等待1秒 await Task.Delay(TimeSpan.FromSeconds(1)); Trace.WriteLine(val); }
關(guān)于異步方法,還有一條重要的準(zhǔn)測:你一旦在代碼中使用了異步,最好一直使用。調(diào)用異步方法時,應(yīng)該用await
等待它返回的task對象
。一定要避免使用Task.Wait
或Task<T>.Result
方法,因為它們會導(dǎo)致死鎖。
有兩種基本的方法可以創(chuàng)建Task實例
:
Task.Run
創(chuàng)建計算類的任務(wù)(CPU實際執(zhí)行的指令)TaskFactory.StartNew
需要特定的計劃運行TaskCompletionSource<T>
創(chuàng)建基于事件的任務(wù)(例如:大部分I/O
任務(wù))
到此這篇關(guān)于C#異步編程ConfigureAwait的使用小結(jié)的文章就介紹到這了,更多相關(guān)C#異步ConfigureAwait內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WPF拖動DataGrid滾動條時內(nèi)容混亂的解決方法
這篇文章主要介紹了WPF拖動DataGrid滾動條時內(nèi)容混亂的解決方法2016-10-10對C#中public、private、protect的區(qū)別說明
這篇文章主要介紹了對C#中public、private、protect的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04C# 中的IComparable和IComparer的使用及區(qū)別
這篇文章主要介紹了C# 中的IComparable和IComparer的使用及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01C#泛型集合類System.Collections.Generic
這篇文章介紹了C#中的泛型集合類System.Collections.Generic,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05