欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#異步編程ConfigureAwait的使用小結(jié)

 更新時(shí)間:2025年08月10日 11:27:12   作者:gs108  
本文介紹了異步編程在GUI和服務(wù)器端應(yīng)用的優(yōu)勢(shì),詳細(xì)的介紹了async和await的關(guān)鍵作用,通過(guò)實(shí)例解析了在UI線程正確使用await.ConfigureAwait,及創(chuàng)建Task的不同方法,感興趣的可以了解一下

異步編程是并發(fā)的一種形式,它有兩大好處:

  • 對(duì)于面向終端用戶(hù)的GUI程序,提高了響應(yīng)能力
  • 對(duì)于服務(wù)器端應(yīng)用,利用線程池實(shí)現(xiàn)了可擴(kuò)展性

異步編程的兩個(gè)關(guān)鍵字:asyncawait。

需要注意:如果async方法有返回值,應(yīng)返回Task<T>;如果沒(méi)有返回值,應(yīng)返回Task。

嚴(yán)重警告:不要用void作為async方法的返回類(lèi)型!async方法可以返回void,但這僅限于編寫(xiě)事件處理程序。一個(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方法在最開(kāi)始時(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.WaitTask<T>.Result方法,因?yàn)樗鼈儠?huì)導(dǎo)致死鎖。

有兩種基本的方法可以創(chuàng)建Task實(shí)例

  • Task.Run 創(chuàng)建計(jì)算類(lèi)的任務(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)文章

最新評(píng)論