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

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

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

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

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

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

需要注意:如果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.WaitTask<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)文章

最新評論