眾所周知(除了不知道的),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(); }
這樣,新大陸就出現了。
查看本欄目