Async和Await 非同步方法

2022-05-22 12:48:13 字數 1976 閱讀 4738

async和await關鍵字是c#非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用.net framework或windows runtime的資源建立乙個非同步方法如同你建立乙個同步的方法一樣容易。通過使用async和await定義的非同步方法,這裡被稱為非同步方法。

非同步方法的特點:

方法中包含了async修飾符。

乙個async方法按照慣例以「async」結尾。

返回型別是如下型別之一:

task當你的方法有返回值時,tresult即返回值的型別

task 當你的方法沒有return語句,或者返回值並不參與任何形式的運算(包括賦值操作)。

void 當你編寫乙個非同步事件處理時會用到。

方法通常包括至少乙個await的表示式,這意味著該方法在遇到await時不能繼續執行,直到等待非同步操作完成。在此期間,該方法將被暫停,並且控制權返回到該方法的呼叫者。

執行緒非同步方法的目的是不阻塞操作。在async方法中, await任務在執行的過程中,並不會阻塞當前的執行緒,其餘的方法可以繼續執行,控制權將會移交到async方法的呼叫者。

async和await關鍵字並不會建立額外的執行緒,async方法不會去請求多執行緒操作。真正建立執行緒的操作是由task.run()實現的,乙個async方法並不是在他自己的執行緒上執行的,只有當方法被啟用時,才會使用當前執行緒的上下文和處理時間。

async方法要比backgroundworker更實用,而且使用起來更簡單而且不用去過多的考慮競態衝突神馬的。async方法會將執行中的**依據某些演算法進行合理的拆分,並傳遞給執行緒池,這也是backgroundworker不能比的。

async和await

如果需要使用async或者await指定乙個非同步方法,我們需要注意一下兩點:

用async標記的非同步方應該使用await關鍵子來制定掛起點。await操作符會告訴編譯器,這個async方放在完成之前,後面的**無法繼續執行,同時,控制權轉移到async方法的呼叫者。

標記為async的方法,呼叫時應使用await。

乙個async方法裡通常包含乙個或多個的對應的await操作符,但如果沒有await表示式也不會導致編譯錯誤。但如果呼叫乙個async方 法,卻不使用await關鍵字來標記乙個掛起點的話,程式將會忽略async關鍵字並以同步的方式執行。編譯器會對類似的問題發出警告。

返回型別和引數

在.net framework程式設計中,乙個async方法通常返回的型別是task或者task。在非同步方法中,await操作符作用於從另外乙個非同步方法返回的task。

如果指定task為返回結果,那麼這個方法必須包含return指定的tresult結果的語句。

如果使用task作為返回值,那麼這個方法應該不存在使用return語句返回結果的**,或者返回的結果不參與任何運算(包括賦值操作)。

每乙個返回的task都代表乙個正在執行的工作,task包裝的資訊中包含了這個非同步方法的執行時的狀態,最終的結果,或者處理過程中丟擲的異常。

如果返回值為void,這種型別主要使用於定義事件處理。非同步事件通常被認為是一系列非同步操作的開始。使用void返回型別不需要await,而且呼叫void非同步方法的函式不會捕獲方法丟擲的異常。

另外,async方法不能使用ref或者out引數,但是可以呼叫含有這些引數的方法。

命名約定

按照約定,你應該在非同步方法的名稱後面追加「async」用以標記此方法。但是在event,基類和介面中不需要遵守約定,就像本文例子中event處理函式button1_click一樣。

例子:

using system;

using system.threading.tasks;

namespace asyncandawait

public static taskgetvalueasync(double num1, double num2)

return num1;

});}

public static async void displayvalue()

}}

非同步和等待 async和await

在.net 4.5中,通過async和await兩個關鍵字,引入了一種新的基於任務的非同步程式設計模型 tap 在這種方式下,可以通過類似同步方式編寫非同步 極大簡化了非同步程式設計模型。如下式乙個簡單的例項 static async void downloadstringasync2 uri ur...

vue中非同步函式async和await

一,非同步函式async 1.1,async作為乙個關鍵字放到函式前面,用於表示函式是乙個非同步函式,因為async就是非同步的意思,非同步函式也就意味著該函式的執行不會阻塞後面 的執行。寫乙個async 函式。就是在函式前面加上async 關鍵字,來表示它是非同步的,那怎麼呼叫呢?async 函式...

C 非同步程式設計await與async

使用async修飾符可將方法 lambda 表示式或匿名方法指定為非同步。如果對方法或表示式使用此修飾符,則其稱為非同步方法 class program public async static task runtimeasync 在非同步函式中,await之後會自動建立出乙個執行緒。執行結果就可以看...