程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 每天一段代碼-異步編程(1),代碼異步編程

每天一段代碼-異步編程(1),代碼異步編程

編輯:C#入門知識

每天一段代碼-異步編程(1),代碼異步編程


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved