如何讓你的代碼在“同一時間”干著兩件件事呢?比如說,在初始化加載配置的同時,UI界面能夠響應用戶的各種點擊事件。而不置於卡死,特別是出現如下面這種情況的時候,對於用戶來說是很崩潰的。
那麼我們得用什麼技術來避免這種問題呢?是的,異步編程。(當然引發程序卡死,不一定是沒有用異步,也可能程序本身就有異常)
假設現在你正在吃著早飯,在吃的同時你又想玩游戲,現在我們用代碼來實現這個問題。
首先創建一個吃飯的方法
1 async static Task<string> EatAsync() 2 { 3 Console.WriteLine("把飯放到嘴裡"); 4 //這是一個很耗時的操作 5 var result = await Task.Run<string>(() => 6 { 7 for (int i = 0; i < 5; i++) 8 { 9 Thread.Sleep(500); 10 Console.WriteLine("嚼了{0}下", i); 11 } 12 return "把飯咽下去"; 13 }); 14 return result; 15 }
在上面的代碼中,我們看到:異步方法需要一個async修飾符;異步方法最好統一以“Async”作為後綴結尾。
對於異步方法的返回值有以下幾種類型:
如果你的方法有操作數為 TResult 類型的返回語句,則為 Task。
如果你的方法沒有返回語句或具有沒有操作數的返回語句,則為 Task。
如果你編寫的是異步事件處理程序,則為 Void。
下面是玩游戲的方法(當然這只是個簡單的方法)
1 //這個方法你也可以用寫成異步方法 2 static void PlayGame() 3 { 4 for (int i = 0; i < 10; i++) 5 { 6 Thread.Sleep(200); 7 Console.WriteLine("超級瑪麗奔跑中..."); 8 } 9 }
一個簡單吃早飯的函數
1 async static void BreakfastTimeAsync() 2 { 3 //返回一個string類型的結果 4 Task<string> temp = EatAsync(); 5 6 //在這裡做一些與吃飯不相關的事 7 PlayGame(); 8 9 //等待temp任務的完成 10 var result = await temp; 11 12 //對最終的結果做一些處理 13 Console.WriteLine(result); 14 }
在異步方法中方法通常包含至少一個 await 表達式,該表達式標記一個點,在該點上,直到等待的異步操作完成方法才能繼續。 同時,將方法掛起,並且控件返回到方法的調用方。
最後來看下運行結果
最後流年建議大家在吃飯的時候不要做別的事情,這是很危險的
https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task%28v=vs.110%29.aspx