async & await 非同步編程的一點巧方法

来源:http://www.cnblogs.com/zhiyong-ITNote/archive/2017/06/17/7041224.html
-Advertisement-
Play Games

await 關鍵字不會創建新的線程,而是由Task任務或是FCL中的xxxAsync等方法創建的線程,而且這裡創建的線程都是基於線程池創建的工作線程,屬於後臺線程。 await關鍵字會阻塞/暫停調用它的方法,也即下麵的 Phycology 方法.當阻塞其調用方法的時候,程式會回到UI線程中去執行,也 ...


await 關鍵字不會創建新的線程,而是由Task任務或是FCL中的xxxAsync等方法創建的線程,而且這裡創建的線程都是基於線程池創建的工作線程,屬於後臺線程。

 

await關鍵字會阻塞/暫停調用它的方法,也即下麵的 Phycology 方法.當阻塞其調用方法的時候,程式會回到UI線程中去執行,也就是main方法中去執行,這點可以通過

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事兒! 其內的程式來判斷.

 

async & await 組合的程式片段一定要註意使用,在此列舉幾個註意事項,也可以說是優化事項。我將其放到了代碼的註釋部分,這樣更方便你理解:

/// <summary>
        /// ....各類書籍推薦...
        /// 
        /// 應當在此處呈現await的返回值...
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //第一類書籍:心理學....
            var book = new List<book>()
            {
                new book() { book_classify = "心理學", book_name = "每一種孤獨都有陪伴" },
                new book() { book_classify = "心理學", book_name = "願你擁有被愛照亮的生命" },
                new book() { book_classify = "心理學", book_name = "感謝自己的不完美" },
                new book() { book_classify = "編程語言", book_name = "編寫高質量代碼 改善C#程式的157個建議" },
                new book() { book_classify = "編程語言", book_name = "python cookbook" },
                new book() { book_classify = "編程語言", book_name = "設計模式(C#版)" }
            };

            //var test = book.Where(p => p.book_classify == "心理學").Select(p => p.book_name);

            //foreach(var i in test)
            //{
            //    Console.WriteLine(i);
            //}

            var task = handle(book);


            Console.WriteLine(task.Result);

        }

        /// <summary>
        /// Attention:
        /// 在這裡取出我們通過Task任務放到線程池中處理並返回的數據,同時註意
        /// 除了傳遞非同步調用方法(這裡是 Phycology方法)之外,因為可能需要做其他的操作,
        /// 我們可以將await關鍵字放在非同步調用方法返回的變數處,而不是直接使用await關鍵字去等待調用方法
        /// 這樣設計充分利用了時間,提高了效率...
        /// </summary>
        /// <param name="book"></param>
        /// <returns></returns>
        public static async Task<string> handle(List<book> book)
        {
            var _physchology = Phycology(book);

            var _programmer = Programmer(book);

            ///在這裡做一些其他的操作...
            ///以充分利用時間

            return await _physchology + await _programmer;

        }


        /// <summary>
        /// Attention:
        /// 應當將需要的數據返回到調用方法處...
        /// 在這裡是  sb
        /// </summary>
        /// <param name="book"></param>
        /// <returns></returns>
        public static async Task<string> Programmer(List<book> book)
        {
            StringBuilder sb = new StringBuilder();

            return await Task.Run(() =>
            {
                var programmer = book.Where(p => p.book_classify == "編程語言").Select(p => p.book_name).ToList();

                foreach(var i in programmer)
                {
                    sb.Append(i + "\r\n");
                }

                return sb.ToString();
            });

        }

        public static async Task<string> Phycology(List<book> book)
        {
            StringBuilder sb = new StringBuilder();
            return await Task.Run(() =>
            {

                var _phychology = book.Where(p => p.book_classify == "心理學").Select(p => p.book_name).ToList();

                foreach(var i in _phychology)
                {
                    sb.Append(i + "\r\n");
                }

                return sb.ToString();
            });
        }

    }

最後的實現:

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • netstat 命令用於顯示各種網路相關信息,如網路連接,路由表,介面狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等 1 常用選項: -a :(all)顯示所有選項,預設不顯示LISTEN相關 -t :( ...
  • 測試工具:ab(apacheBench) 硬體環境: Intel xeon cpu E5-2682 v4 2.50GHz 4 core 8GBytes 記憶體 軟體環境: ubuntu16 nginx 靜態文件 3Kbytes 26000次響應/秒(平均值)吞吐量:111Mbytes/秒(平均值)併發 ...
  • Bonding 就是講到快網卡綁定到同一IP地址對外服務,可以實現高可用或者負載均衡。當然,直接給兩塊網卡設置同一IP地址是不可能的。通過bonding,虛擬一塊網卡對外提供連接,物理網卡被修改為同一MAC地址。 一 Bonding 的工作模式 Mode 0 (balance-rr) 輪轉(Roun ...
  • 1.PHP程式員玩轉Linux系列-怎麼安裝使用CentOS 2.PHP程式員玩轉Linux系列-lnmp環境的搭建 3.PHP程式員玩轉Linux系列-搭建FTP代碼開發環境 4.PHP程式員玩轉Linux系列-備份還原MySQL 5.PHP程式員玩轉Linux系列-自動備份與SVN 6.PHP程 ...
  • 目錄 "簡介" "常用命令" "功能" "代理" "反向代理" "集群" HTTP集群 TCP集群 "重定向" "靜態文件" "HTTPS配置" "常見問題" 簡介 Nginx ("engine x") 是一款輕量級,高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。 傳 ...
  • 擴容兩步走: 第一步捲擴容 第二步文件系統擴容 需要註意的是不同Linux發行版本,文件格式有所不同 xfs用 ext3用 是時候給蒼老師安排換個新房子 :) ...
  • 1. 文件描述符(重點) 在Linux系統中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設備文件。文件描述符(file descriptor)是內核為了高效管理已被打開的文件所創建的索引,其是一個非負整數(通常是小整數),用於指代被打開的文件,所有執行I/O操作的系統調用都通過 ...
  • 最近在將項目從.net 遷移到.net core環境中,遷移完成後,發佈於Windows平臺上進行測試,所有功能均能正常運行。 為了項目能夠在正式環境也能正常運行,提前進行Linux環境部署(Centos7)預發佈,就在預發佈後進行代碼的基本測試後, 發現日誌中出現了string轉datetime錯 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...