C async 的三大返回型別

2022-01-12 11:40:07 字數 2731 閱讀 6560

博主簡單數了下自己發布過的非同步文章,已經斷斷續續 8 篇了,這次我想以 async 的返回型別為例,單獨談談。

非同步方法具有三個可讓開發人員選擇的返回型別:task、task 和 void。 

什麼時候需要使用哪一種返回型別,具體情況需要具體分析。如果使用不當,程式的執行結果也許並不是你想要的,下面我們就來好好談談如何針對不同的情況選擇不同的返回型別。

【記住】

當你新增 

async 關鍵字後,需要返回乙個將用於後續操作的物件,請使用task。

task返回型別可用於 async 方法,其中包含指定型別tresult

在下面的示例中,getdatetimeasync 非同步方法包含乙個返回當前時間的 return 語句。 因此,方法宣告必須指定task

async taskgetdatetimeasync()

呼叫 getdatetimeasync 方法:

async

task callasync()

當 getdatetimeasync 從 await 表示式中呼叫時,await 表示式將檢索儲存在由 getdatetimeasync 返回的 task 中的 datetime 型別值。 

async

task callasync()

通過 callasync 方法對 getdatetimeasync 方法的呼叫,對非立即等待的方法 getdatetimeasync 的呼叫返回task。 該任務指派給示例中的 datetime 的task變數。 因為 datetime 的task變數是 task,也就是說這裡的tresult就是 datetime 型別。 在這種情況下,tresult 表示日期型別。 當await應用於 task,await 表示式的計算結果為 task的 datetime 型別的內容。同時,該值會分配給 now 變數。

這次我演示不同的變數,你可以自己對比下結果是否相同:

async

task callasync()

");console.writeline($

"now2: ");

console.writeline($

"t.result: ");

}

我這邊可以給出的答案就是:結果是一樣的。

【注意】主要有兩種方式獲取結果值,乙個是使用 result 屬性,乙個是使用 await。他們的區別在於:如果你使用的是 result,它帶有阻塞性。即在任務完成之前進行訪問讀取它,當前處於活動狀態的執行緒都會出現阻塞的情形,一直到結果值可用。所以,在絕大多數情況下,除非你有絕對的理由告訴自己,否則都應該使用 await,而不是屬性 result 來讀取結果值。

【記住】

你如果只是想知道執行的狀態,而不需要乙個具體的返回結果時,請使用 task。

乙個返回型別為 task 型別的非同步方法,它的具體實現不應該包含 return 語句,或者說是乙個 return void 的語句。這個 task 型別是不包含屬性 result 的。跟 task呼叫一樣,呼叫方法直接使用 await 掛起並等待非同步方法的執行完畢。

請看示例:

async

task delayasync()

通過使用 await 語句而不是 await 表示式來呼叫和等待 delayasync 方法,類似於返回 void 的方法的呼叫語句。 await 運算子的應用程式在這種情況下不生成值。

請看呼叫 delayasync 的示例。

//

呼叫和等待方法在同一宣告中

await delayasync();

現在,我用將呼叫和等待的方法進行分離:

//

分離 task delaytask =delayasync();

await delaytask;

【記住】如果在觸發後,你懶得管,請使用 void。如事件處理程式(主要用途)。

void 返回型別主要用在事件處理程式中,一種稱為「fire and forget」(觸發並忘記)的活動的方法。除了它之外,我們都應該盡可能是用 task,作為我們非同步方法的返回值。

返回 void,意味著不能 await 該非同步方法,即可能出現執行緒阻塞,並且也無法獲取 exception,丟擲的異常,通常這些異常會導致我們的程式失敗,如果你使用的是 task 和 task,catch 到的異常會包裝在屬性裡面,呼叫方法就可以從中獲取異常資訊,並選擇正確的處理方式。

現在,異常也可以使用 await 了,請移步到這裡 《

回眸 c# 的前世今生 - 見證 c# 6.0 的新語法特性》。

void 返回值示例:

private

async

void button1_click(object

sender, eventargs e)

利用 async & await 的非同步程式設計

怎樣使用 async & await 一步步將同步**轉換為非同步程式設計

利用 async & await 進行非同步 io 操作

【博主】反骨仔

【出處】

【參考】

【參考】微軟官方文件

C async 的三大返回型別

博主簡單數了下自己發布過的非同步文章,已經斷斷續續 8 篇了,這次我想以 async 的返回型別為例,單獨談談。非同步方法具有三個可讓開發人員選擇的返回型別 task task 和 void。什麼時候需要使用哪一種返回型別,具體情況需要具體分析。如果使用不當,程式的執行結果也許並不是你想要的,下面我...

函式(三) 返回型別和 return 語句

基於 c primer p199 1.無返回值的函式 只有返回型別是 void 的函式。可以不使用 return 語句,會隱式地執行。若想在中間位置提前退出,可以使用 return 語句。可以使用 return 語句返回另乙個返回 void 型別的函式。2.有返回值的函式 在含有 return 語句...

軟體的三大型別 單機型別 BS型別 CS型別

單機型別 最開始的軟體就是那些不需要聯網的單機軟體。cs型別 有的程式需要統一管理軟體中使用的資料,所以就將儲存資料的資料庫統一存放在一台主機中,所有的使用者在需要資料時都要從主機獲取,這時就分出了客戶端和服務 端,使用者安裝的軟體叫客戶端 client 統一管理資料的主機中的軟體就叫服務端 ser...