異步編程系列(Thread、Task、async/await、ajax等)


 

    經過一番努力,我寫的異步編程系列也算有頭有尾,當然不是說這個系列已經更新完畢,這個頭尾只是表示新舊知識點都有簡單涉及到,接下去我還會豐富這一系列並且有機會整個小應用(願景是弄一個開源組件吧,結合socket)。

 

術語:

APM    異步編程模型,Asynchronous Programming Model

EAP    基於事件的異步編程模式,Event-based Asynchronous Pattern

TAP    基於任務的異步編程模式,Task-based Asynchronous Pattern

TPL    任務並行庫,Task Parallel Library

 

    現在我給這個系列整個目錄和做個簡單介紹。

“概要 + 目錄”整理

    C#語言是微軟於2000年發布,基於.NET Framewrok框架的、面向對象的高級語言。經過近十三年的發展,經歷了5次大的升級,目前最新版本為C#5.0(對應於.NET Framework 4.5)。其中每個版本發布都是有一個“主題”。即:C#1.0托管代碼→C#2.0泛型→C#3.0LINQC#4.0動態語言→C#5.0異步編程。這系列既是針對“異步編程”所寫。

C#版本

.NET 版本

Visual Studio 版本

特性描述

C# 1.0

.NET 1.0/1.1

VS 2002/2003

C#的第一個正式發行版本。微軟的團隊從無到有創造了一種語言,專門為.NET編程提供支持

 

 

 

C# 2.0

.NET 2.0

 

 

 

VS 2005

C#語言開始支持泛型,.NET Framework 2.0新增了支持泛型的庫

.NET 3.0

新增了一套API來支持分布式通信(Windows Communication Foundation WCF)、富客戶端表示(Windows Presentation Foundation)、工作流(Windows WorkflowWF)以及Web身份驗證(Cardspaces

C# 3.0

.NET 3.5

VS 2008

添加了對LINQ的支持,對用於集合編程的API進行了大幅改進。.NET Framework 3.5對原有的API進行了擴展,從而支持了LINQ   

C# 4.0

.NET 4.0

VS 2010

添加了動態類型(dynamic)的支持,引入了新的輕量級線程同步基元及新的異步編程類庫TPL

C# 5.0

.NET 4.5

VS 2012

改進並擴展了.NET4.0中引入的TPL類庫,並引入asyncawait關鍵字輕松構建異步方法。

 

1. 異步編程基礎

資料整理路線:線程----線程池----線程同步----並行任務----三種異步編程模型。首先了解最基礎的線程(Thread),再進一步明白線程管理器(ThreadPool)。因為多個工作項之間可能出現並行運行,會造成對共享資源的訪問問題,所以引入線程同步基元來讓共享資源得到合理使用。最后介紹.NET4.0新引入並在.NET4.5中得到優化和擴展的TPL(任務並行庫),並結合C# 5.0中新引入的asyncawait關鍵字輕松構建異步方法。詳細如下:

異步編程:線程概述及使用

異步編程:使用線程池管理線程

異步編程:線程同步基元對象

異步編程:輕量級線程同步基元對象

異步編程:.NET4.5 數據並行

異步編程:異步編程模型 (APM)

異步編程:基於事件的異步編程模式(EAP)

異步編程:.NET 4.5 基於任務的異步編程模型(TAP)

多線程之取消令牌(CancellationToken)

 

 

(譯).NET4.X 並行任務中Task.Start()的FAQ

(譯).NET4.X並行任務Task需要釋放嗎?

Task.CompletedTask和Task.Result小記

 

Thread、ThreadPool、Task、Parallel、Async和Await基本用法、區別以及弊端

 

 

       C#語言規范中有說明,調用await t本質會按如下順序執行:

            1、先調用t.GetAwaiter()方法,取得等待器a;
            2、調用a.IsCompleted取得布爾類型b;
            3、如果b=true,則立即執行a.GetResult(),取得運行結果;
            4、如果b=false,則看情況:
                   4.1、如果a沒實現ICriticalNotifyCompletion,則執行(a as INotifyCompletion).OnCompleted(action)
                   4.2、如果a實現了ICriticalNotifyCompletion,則執行(a as ICriticalNotifyCompletion).OnCompleted(action)
                   4.3、執行隨后暫停,OnCompleted完成后重新回到狀態機;

 

 

  活鎖與死鎖

    #、加鎖后超時釋放,且超時要有一定的隨機性

    #、加鎖按照一定的順序規則

 

2. async\await 使用注意事項

(譯)關於async與await的FAQ

[譯]async/await中阻塞死鎖

async中必須始終返回Task(@Ron.liang)

此文因在async返回void,在基於任務的異步模式(TAP)並不知道異步任務的狀態,當 this.context.Update 執行完成后,發現掛載在內存中的連接已經沒有使用,就執行了回收;實際上,此時程序還沒有執行完成,但是 TAP 並不知道,所以它不會去阻止這個回收的過程(使用標記),釋放 DbContext 后拋出異常

 

3. 示例:構建Async同步基元

TPL提供同步基元,但這只是提供TPL的應用思路,不推薦將這些同步基元應用於項目中。

(譯)構建Async同步基元,Part 1 AsyncManualResetEvent

(譯)構建Async同步基元,Part 2 AsyncAutoResetEvent

(譯)構建Async同步基元,Part 3 AsyncCountdownEvent

(譯)構建Async同步基元,Part 4 AsyncBarrier

(譯)構建Async同步基元,Part 5 AsyncSemaphore

(譯)構建Async同步基元,Part 6 AsyncLock

(譯)構建Async同步基元,Part 7 AsyncReaderWriterLock

 

4. 前端中的異步

觸碰jQuery:AJAX異步詳解

使用jQuery.form插件,實現完美的表單異步提交

 

5. 持續更新……

 

 “加關注”更快獲得持續更新。

喜歡本系列博文的園友還請多多推薦image(*^_^*)……感謝大家支持!

 

 

 

推薦閱讀:

高性能IO模型淺析

為什么要放棄使用Thread.Sleep

 

 

 

 


免責聲明!

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



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