使用 Async 和 Await 的異步編程(C#)

本篇的內容大部分來自於同事的郵件描述,本想本身用言簡意賅的用語言轉述,無奈語言水平有限,且同事的介紹也是極盡詳細和明瞭,故再也不多此一舉,直接引述....數據庫

 

經過使用異步編程,你能夠避免性能瓶頸並加強應用程序的整體響應能力。可是,編寫異步應用程序的傳統技術可能比較複雜,使它們難以編寫、調試和維護。編程

Visual Studio 2012 引入了一個簡化的方法,異步編程,在 .NET Framework 4.5 和 Windows 運行時利用異步支持。 編譯器可執行開發人員曾進行的高難度工做,且應用程序保留了一個相似於同步代碼的邏輯結構。所以,你只需作一小部分工做就能夠得到異步編程的全部好處。併發

 

拿我如今作的項目來講,主要是寫WebAPI,其中一些接口中返回值的處理尤爲複雜,如:須要在幾個數據源中拿數據,而後可能還要根據業務進行大數據的處理和分析等等,執行效率就變得沒那麼快了,且這些操做都是同步完成的,包括一些佔用資源的操做,若是有多個WebApi請求併發時,IIS處理請求的線程池就會被這個消耗資源的操做(好比訪問數據庫、或者請求別的服務)所佔,在操做完成前線程不釋放,IIS線程池可用性下降。app

 

而後我的又特懶,並不想寫那些傳統的異步實現方式,無心間看到同事的推薦,甚爲驚訝,這尼瑪異步實現得也太簡單了吧,因而忍不住想向各位分享一番!!異步

 

示例以下:async

1.原代碼,同步處理異步編程

[HttpGet]性能

public HotelListResponse List(…大數據

{ui

//方法內部有很多數據獲取和處理的操做,暫不一一貼出

result = HotelBusiness.Instance.QueryHotelList(parameter);  // 阻塞IIS線程

return result;

}

2.只加了幾個關鍵字,就變成了異步處理方式

[HttpGet]

public async Task<HotelListResponse> List(…

{

    …

    return await Task.Factory.StartNew(() => HotelBusiness.Instance.QueryHotelList(parameter)); // 資源消耗的操做,移到了異步上

}

 

3.修改以後的代碼運行時,有請求進來時當前的IIS線程ID是9

 

 

 

 

4.消耗資源的操做,是在另一個線程上運行,並無佔用IIS處理該請求的線程

 

 

 

關於使用 Async 和 Await 的異步編程

 

這裏主要是使用了async和await的關鍵字,是.net 4.5新特性,請參考

Asynchronous Programming with Async and Await (C# and Visual Basic)

                   URL: https://msdn.microsoft.com/en-us/library/hh191443.aspx

                   URL: https://msdn.microsoft.com/zh-cn/library/hh191443.aspx  (中文翻譯版)

 

我也是纔開通的博客,亦是第一次寫博客,若有不足之處,歡迎各位大神批評指正,若有不一樣見地,不妨在下方寫一下,不勝感謝!

相關文章
相關標籤/搜索