C 非同步程式設計async await詳解

2021-08-21 21:16:20 字數 2421 閱讀 3016

當函式使用async標記後,返回值必須為void,task,task,當返回值為task時,函式內部只需要返回t型別,編譯器會自動包裝成task型別,如下兩個函式執行結果一致:

public taskf1()

public async taskf2()

await關鍵字必須在具有async標記的函式內使用,使用await關鍵字後編譯器會使用狀態機進行編譯,await關鍵字不僅僅只可以對tsak物件使用,我們也可以自己實現await的物件。當函式使用了乙個await關鍵字後,會被分割成兩部分,編譯的時候會當作函式的兩個狀態。函式的兩部分會分別是await前面的一部分,和await後面的一部分,例如:

這兩部分執行的位置不一樣,第一部分和正常函式一樣呼叫函式的時候直接執行,第二部分的執行取決於我們await的物件,執行的位置也在await物件內部。下面是乙個await物件的實現,展示了各個部分的執行過程。

public class a

}public class b : inotifycompletion

");return iscompleted;}}

public void oncompleted(action continuation)

public int getresult()

}class program

static async void testawait(a a)

");}

static void main(string args)

}

執行結果:

如果乙個物件可以await,這個物件必須實現getawaiter函式,可以是成員方法,也可是擴充套件方法。getawaite需要返回乙個物件,返回的物件需要滿足3個要求:1、實現inotifycompletion介面;2、實現getresult函式;3、實現bool iscompleted,get屬性。

從上面例子的執行結果可以很容易看出各個部分的執行順序,程式執行到await時首先會呼叫物件的getawaiter函式函式,然後呼叫getawaiter返回物件的iscompleted屬性,當iscompleted=falase時,會呼叫getawaiter返回物件的oncompleted函式,oncompleted函式有乙個action引數,這個引數也await將函式分割後第二部分的**;當iscompleted=true時,會直接呼叫await將函式封裝後第二部分的**。

await物件執行順序與物件的iscompleted屬性有關,在await task物件時,執行順序也與task是否已經完成有關。當task. iscompleted=false時,這個時候會呼叫taskawaiter.oncompleted函式,oncompleted內部會呼叫task.continuewith函式,傳入oncompleted的action引數。這樣當task執行完成後就會繼續執行函式中await task的第二部分的**。當task. iscompleted=true時,程式會直接繼續執行await task的第二部分的**,和同步執行一樣。

如下:

class program

", thread.currentthread.managedthreadid);

return r;

}public static async taskawaittask2()

", thread.currentthread.managedthreadid);

task.delay(2000).wait();

return 5;

});var r = await t;

console.writeline("task ", thread.currentthread.managedthreadid);

return r;

}static void main(string args)

", thread.currentthread.managedthreadid);

thread t = new thread(() => ", thread.currentthread.managedthreadid);

console.writeline("\n");

awaittask1().wait();

console.writeline("\n");

awaittask2().wait();

});t.start();

console.read();}}

結果:

C 非同步程式設計async await

async await使c 用以實現協程程式設計的方式,由task排程器統一排程每乙個非同步任務的執行,從排程器的執行緒池中拿出執行緒來執行,遇到await時執行緒會被 直到非同步方法執行完成 async本身沒有任何實際作用,只是在編碼期給程式設計師提示呼叫的方法為非同步,真正起作用的是await和...

C 非同步程式設計之async await

async和await這一組關鍵字是.net4.5新增的一種非同步程式設計方式,今天就根據自己的理解講講async和await與task之間的關係。拿作業系統來說,cpu就具有非同步性。當在進行io的耗時操作時,cpu不會處於阻塞狀態,而是可以繼續執行其它的指令。程式設計中非同步通常用於開啟大檔案 ...

非同步程式設計之async,await

c 5引入非同步程式設計,可以在.net framework 4.5及更高版本或者.net core中進行非同步程式設計。關於非同步程式設計的主要使用場景,參見使用 async 和 await 的非同步程式設計 c static void main string args 模擬非同步main sta...