博主簡單數了下自己發布過的非同步文章,已經斷斷續續 8 篇了,這次我想以 async 的返回型別為例,單獨談談。
非同步方法具有三個可讓開發人員選擇的返回型別:task、task 和 void。
什麼時候需要使用哪一種返回型別,具體情況需要具體分析。如果使用不當,程式的執行結果也許並不是你想要的,下面我們就來好好談談如何針對不同的情況選擇不同的返回型別。
【記住】當你新增
async 關鍵字後,需要返回乙個將用於後續操作的物件,請使用task。
task返回型別可用於 async 方法,其中包含指定型別tresult
。
在下面的示例中,getdatetimeasync 非同步方法包含乙個返回當前時間的 return 語句。 因此,方法宣告必須指定task
。
async taskgetdatetimeasync()
呼叫 getdatetimeasync 方法:
asynctask callasync()
當 getdatetimeasync 從 await 表示式中呼叫時,await 表示式將檢索儲存在由 getdatetimeasync 返回的 task 中的 datetime 型別值。
asynctask callasync()
通過 callasync 方法對 getdatetimeasync 方法的呼叫,對非立即等待的方法 getdatetimeasync 的呼叫返回task
。 該任務指派給示例中的 datetime 的task
變數。 因為 datetime 的task
變數是 task,也就是說這裡的tresult
就是 datetime 型別。 在這種情況下,tresult 表示日期型別。 當await
應用於 task,await 表示式的計算結果為 task的 datetime 型別的內容。同時,該值會分配給 now 變數。
這次我演示不同的變數,你可以自己對比下結果是否相同:
asynctask callasync()
");console.writeline($
"now2: ");
console.writeline($
"t.result: ");
}
我這邊可以給出的答案就是:結果是一樣的。
【注意】主要有兩種方式獲取結果值,乙個是使用 result 屬性,乙個是使用 await。他們的區別在於:如果你使用的是 result,它帶有阻塞性。即在任務完成之前進行訪問讀取它,當前處於活動狀態的執行緒都會出現阻塞的情形,一直到結果值可用。所以,在絕大多數情況下,除非你有絕對的理由告訴自己,否則都應該使用 await,而不是屬性 result 來讀取結果值。
【記住】你如果只是想知道執行的狀態,而不需要乙個具體的返回結果時,請使用 task。
乙個返回型別為 task 型別的非同步方法,它的具體實現不應該包含 return 語句,或者說是乙個 return void 的語句。這個 task 型別是不包含屬性 result 的。跟 task呼叫一樣,呼叫方法直接使用 await 掛起並等待非同步方法的執行完畢。
請看示例:
asynctask 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 返回值示例:
privateasync
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...