1. 程式人生 > >如何在入口點使用非同步等待(await)

如何在入口點使用非同步等待(await)

眾所周知(除了不知道的),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();
        }

這樣,新大陸就出現了。