如何讓你的代碼在“同一時間”干著兩件件事呢?比如說,在初始化加載配置的同時,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