C#異步了解一下


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM