async和await這一組關鍵字是.net4.5新增的一種非同步程式設計方式,今天就根據自己的理解講講async和await與task之間的關係。
拿作業系統來說,cpu就具有非同步性。當在進行io的耗時操作時,cpu不會處於阻塞狀態,而是可以繼續執行其它的指令。程式設計中非同步通常用於開啟大檔案、上傳大檔案、發起網路請求等耗時操作,非同步操作在應用程式主線程以外的其它執行緒中執行,主線程可以在非同步操作時執行其它操作。
同步:同步是指順序執行,在執行某個操作時,應用程式必須等待其執行完畢後才能執行下乙個操作,舉個栗子,到了中午的飯點,而我和同事卻有乙個棘手的bug要處理(改bug很耗時的,順便吐槽下,玩遊戲時經常聽到有人把bug當成3個英文本母念成bi you ji),老大要求不改好不能吃飯,這就是乙個同步操作,我們想要吃飯,必須先改完bug。
非同步:非同步是指在執行某個操作時,應用程式可以在執行非同步操作時繼續執行其它操作,還是用上面的栗子,老大估摸著這個bug改完,食堂早沒飯了,就命令我去改bug,然後他跑去吃飯了,即老大在指揮我改bug的時候,並沒有要等我改完才去吃飯,而是自己先跑了,這就是非同步。
用async和await實現非同步程式設計時,需知以下幾點:
非同步方法需用async關鍵字描述,且返回型別只能是void、task、task ,如果你要執行的非同步方法是有返回值的,那麼泛型t就定義為你所需返回的型別
await關鍵字只能在async宣告的非同步方法中使用,且其掛起的方法返回型別必須是task或task.
await 會讓當前方法等待其掛起的方法執行完畢後再繼續執行當前方法。
還是結合**來說明吧:
c#**
using system;
using system.collections
.generic
;using system.linq
;using system.text
;using system.threading
.tasks
;namespace tasktest
", system.threading
.thread
.currentthread
.managedthreadid);
test1();
console.writeline("主線程執行結束:", system.threading
.thread
.currentthread
.managedthreadid);
console.readline();
}public static async void test1()
",system.threading
.thread
.currentthread
.managedthreadid);
await test2();
console.writeline("執行非同步方法test1結束:", system.threading
.thread
.currentthread
.managedthreadid);
}public static async task test2()
", system.threading
.thread
.currentthread
.managedthreadid);
task.run(() => ", system.threading
.thread
.currentthread
.managedthreadid);
}});
console.writeline("執行非同步方法test2結束:", system.threading
.thread
.currentthread
.managedthreadid);}}
}
首先用async定義了兩個非同步方法test1()和test2(),在main方法中呼叫test1(),在test1()中用await掛起了test1()方法,讓其等待test2()執行完畢後再執行後面的**,再來看看test2(),在test2()中用task新開了乙個任務執行緒去執行耗時操作,因為task前面沒有使用await關鍵字,因而不會阻塞test2()剩餘**的執行,然後執行緒控制權交給test1(),test1()執行完後,執行緒控制權交給main方法。
執行結果:
現在,我們在test2()方法中的task.run前面加上await關鍵字,再來看看執行結果:
加上await以後,test2()被掛起,等待task執行完畢後,才能執行後面的**,這時候主線程控制權交回給test1(),而test1()也被掛起,等待test2()執行完畢,所以主線程控制權交回給main方法,從結果上的執行緒id可以看出有兩個執行緒在併發處理,這裡不要被結果中的列印順序迷惑,並不是test2()中的迴圈執行完畢後才把控制權交回給主線程,我們把i的值設大一點就知道了
非同步程式設計之async,await
c 5引入非同步程式設計,可以在.net framework 4.5及更高版本或者.net core中進行非同步程式設計。關於非同步程式設計的主要使用場景,參見使用 async 和 await 的非同步程式設計 c static void main string args 模擬非同步main sta...
JS非同步程式設計之Generator
前言 es6 中提出乙個叫生成器 generator 的概念,執行生成器函式,會返回迭代器物件 iterator 這個迭代器物件可以遍歷函式內部的每乙個狀態。function helloworldgenerator 通過執行生成器返回迭代器物件 var helloworlditerator hell...
非同步程式設計之同步非同步生成器函式
繼續 dart 非同步程式設計系列的最後一篇生成器函式。生成器函式可能比較陌生,在平時開發中使用的不是特別頻繁,但是因為它也是 dart 非同步程式設計的不可缺少的一部分,所以這裡還是展開講解分析,力求做到 dart 非同步程式設計系列文章更完整和全面。生成器函式是一種用於延遲生成值序列的函式,並且...