C 非同步程式設計之async await

2021-07-23 17:36:28 字數 2626 閱讀 8749

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 非同步程式設計系列文章更完整和全面。生成器函式是一種用於延遲生成值序列的函式,並且...