當函式使用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...