C#異步編程ConfigureAwait的使用小結(jié)
異步編程是并發(fā)的一種形式,它有兩大好處:
- 對(duì)于面向終端用戶的GUI程序,提高了響應(yīng)能力
- 對(duì)于服務(wù)器端應(yīng)用,利用線程池實(shí)現(xiàn)了可擴(kuò)展性
異步編程的兩個(gè)關(guān)鍵字:async和await。
需要注意:如果async方法有返回值,應(yīng)返回Task<T>;如果沒(méi)有返回值,應(yīng)返回Task。
嚴(yán)重警告:不要用void作為async方法的返回類型!async方法可以返回void,但這僅限于編寫事件處理程序。一個(gè)普通的async方法如果沒(méi)有返回值,要返回Task,而不是void。
有了上述背景知識(shí),我們來(lái)快速看一個(gè)例子:
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方法在最開始時(shí),以同步方式執(zhí)行。當(dāng)遇到await時(shí),如果這個(gè)異步等待操作沒(méi)有完成,就暫停DoSomethingAsync方法并返回這個(gè)Task,當(dāng)這個(gè)Task完成操作后,繼續(xù)以同步方式執(zhí)行后續(xù)的代碼。
問(wèn)題:如果在UI線程中調(diào)用DoSomethingAsync,這個(gè)方法的每個(gè)同步程序塊都將在此UI線程上運(yùn)行。怎么避免這種錯(cuò)誤行為呢?這就用到了await中的ConfigureAwait方法。
async Task DoSomethingAsync()
{
int val = 13; //以同步方式執(zhí)行
// 異步方式等待1秒
// 將continueOnCapturedContext參數(shù)設(shè)為false,則會(huì)在線程池線程里繼續(xù)運(yùn)行
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
val *= 2;
// 異步方式等待1秒
await Task.Delay(TimeSpan.FromSeconds(1));
Trace.WriteLine(val);
}
關(guān)于異步方法,還有一條重要的準(zhǔn)測(cè):你一旦在代碼中使用了異步,最好一直使用。調(diào)用異步方法時(shí),應(yīng)該用await等待它返回的task對(duì)象。一定要避免使用Task.Wait或Task<T>.Result方法,因?yàn)樗鼈儠?huì)導(dǎo)致死鎖。
有兩種基本的方法可以創(chuàng)建Task實(shí)例:
Task.Run創(chuàng)建計(jì)算類的任務(wù)(CPU實(shí)際執(zhí)行的指令)TaskFactory.StartNew需要特定的計(jì)劃運(yùn)行TaskCompletionSource<T>創(chuàng)建基于事件的任務(wù)(例如:大部分I/O任務(wù))
到此這篇關(guān)于C#異步編程ConfigureAwait的使用小結(jié)的文章就介紹到這了,更多相關(guān)C#異步ConfigureAwait內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析
在C#中,as?和?is?關(guān)鍵字都用于處理類型轉(zhuǎn)換的運(yùn)算符,但它們有不同的用途和行為,本文我們將詳細(xì)解釋這兩個(gè)運(yùn)算符的區(qū)別和用法,需要的朋友可以參考下2025-01-01
C#和JavaScript實(shí)現(xiàn)交互的方法
最近做一個(gè)小項(xiàng)目不可避免的需要前端腳本與后臺(tái)進(jìn)行交互。由于是在asp.net中實(shí)現(xiàn),故問(wèn)題演化成asp.net中jiavascript與后臺(tái)c#如何進(jìn)行交互。2015-05-05
C#代碼實(shí)現(xiàn)在PowerPoint中組合或取消組合形狀
在 PowerPoint 中,對(duì)形狀進(jìn)行組合和取消組合是兩個(gè)非常實(shí)用的功能,本文將介紹如何在 C# 和 VB.NET 中實(shí)現(xiàn) PowerPoint 形狀的組合與取消組合操作,希望對(duì)大家有所幫助2026-05-05
C#讀取CSV/Excel文件數(shù)據(jù)并顯示在DataGridView
本文介紹了C#讀取CSV和Excel文件數(shù)據(jù)并展示在DataGridView控件中的解決方案,該方案包括文件讀取、數(shù)據(jù)處理、用戶界面、性能優(yōu)化等功能特點(diǎn),并提供了詳細(xì)的使用方法和常見問(wèn)題解決方案,旨在實(shí)現(xiàn)多格式支持、智能識(shí)別、強(qiáng)大數(shù)據(jù)處理和用戶友好界面2026-04-04
C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題
這篇文章主要介紹了C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

