如何在入口點使用非同步等待(await)
阿新 • • 發佈:2019-02-09
眾所周知(除了不知道的),C#5新增了一個非同步等待的功能,用來來非常簡單就能夠實現非同步等待了。規則是這樣的:
在呼叫非同步方法前面加上await關鍵字,並且呼叫該非同步方法的方法前面要加上一個async關鍵字。
比如這樣:
async void DoDelayAsync()
{
await Task.Delay(999999999);
}
在進入DoDelayAsync方法時程式碼同步執行,直到遇到await運算子才會開始非同步等待,在等待任務執行完成之前,應用程式不會掛死,這用在使用者介面上相當好,當代碼在await處等 待非同步操作完成的過程中,使用者依然可以操作介面上的其他元素。
以前,要做到這一點,通常需要從另一個執行緒進行回撥,使用委託來CallBack。如今使用await運算子就變得簡單了N倍。
昨天晚上收到一封垃圾郵件,確實是垃圾郵件,因為我是在垃圾箱中看到的一封未讀信件。不知道是誰,反正連名字也不敢報上來。他就提了這麼個問題。
async static void Main(string[] args)
{
await Task.Delay(8000);
Console.Read();
}
這位仁兄非常強大,竟然在入口點也玩起了非同步等待,我猜他當時的內心世界一定是奼紫嫣紅的,開心得無法形容,因為他即將發現新大陸,在入口點也能非同步await。後來我想他的內心世界肯定變成了殘花敗柳。我估計當他狠狠地按下F5後,發現了以下驚魂一幕。
顯然呢,編譯器是不希望他發現新大陸,狠狠地給他以沉重打擊。
是啊,在方法內部用await非同步等待,那呼叫的方法肯定要在前面加上async的,但是偏偏這個方法又是Main,你拿他沒辦法。這下可怎麼辦呢?
有朋友肯定會說,好辦,再定義一個方法,在那方法裡面再封裝一個帶async的方法就行了,就像這樣。
class Program { static void Main(string[] args) { DoDelayAsync0(); Console.Read(); } async static void DoDelayAsync0() { await Task.Delay(3000); Console.WriteLine("Done, Done"); } }
這樣就能運行了,這方法不錯。
既然方法巢狀可以解決,那用委託的結果也是等同的。
static void Main(string[] args)
{
Action act = async () =>
{
await Task.Delay(5000);
Console.WriteLine("哇哈哈,哈哈哇。");
};
// 呼叫委託
act();
Console.Read();
}
這樣,新大陸就出現了。