標籤:相關 lan 並且 strong title 集合 www. aggregate ons
菜鳥學習並行編程,參考《C#並行編程進階教程.PDF》,如有錯誤,歡迎指正。
網址:https://www.cnblogs.com/woxpp/p/3928788.html
目錄
C#並行編程-相關概念
C#並行編程-Parallel
C#並行編程-Task
C#並行編程-並發集合
C#並行編程-線程同步原語
C#並行編程-PLINQ:聲明式資料並行
任務簡介
TPL引入新的基於任務的編程模型,通過這種編程模型可以發揮多核的功效,提升應用程式的效能,不需要編寫底層複雜且重量級的線程代碼。
但需要注意:任務並不是線程(任務啟動並執行時候需要使用線程,但並不是說任務取代了線程,任務代碼是使用底層的線程(軟體線程,調度在特定的硬體執行緒或邏輯核心上)啟動並執行,任務與線程之間並沒有一對一的關係。)
建立一個新的任務時,調度器(調度器依賴於底層的線程池引擎)會使用工作竊取隊列找到一個最合適的線程,然後將任務排入佇列,任務所包含的代碼會在一個線程中運行。
System.Threading.Tasks.Task
一個Task表示一個非同步作業,Task提供了很多方法和屬性,通過這些方法和屬效能夠對Task的執行進行控制,並且能夠獲得其狀態資訊。
Task的建立和執行都是獨立的,因此可以對關聯操作的執行擁有完全的控制權。
使用Parallel.For、Parallel.ForEach的迴圈迭代的並存執行,TPL會在後台建立System.Threading.Tasks.Task的執行個體。
使用Parallel.Invoke時,TPL也會建立與調用的委託數目一致的System.Threading.Tasks.Task的執行個體。
注意項
程式中添加很多非同步操作作為Task執行個體載入的時候,為了充分利用運行時所有可用的邏輯核心,任務調度器會嘗試的並行的運行這些任務,也會嘗試在所有的可用核心上對工作進行負載平衡。
但在實際的編碼過程當中,並不是所有的程式碼片段都能夠方便的用任務來運行,因為任務會帶來額外的開銷,儘管這種開銷比添加線程所帶來的開銷要小,但是仍然需要將這個開銷考慮在內。
Task狀態與生命週期
一個Task執行個體只會完成其生命週期一次,當Task到達它的3種肯呢過的最終狀態之一是,就無法回到之前的任何狀態
下面貼代碼,詳解見注釋,方便大家理解Task的狀態:
View Code
使用任務來對代碼進行並行化
使用Parallel.Invoke可以並行載入多個方法,使用Task執行個體也能完成同樣的工作,下面貼代碼:
View Code
等待任務完成Task.WaitAll
Task.WaitAll 方法,這個方法是同步執行的,在Task作為參數被接受,所有Task結束其執行前,主線程不會繼續執行下一條指令,下面貼代碼
View Code
Task.WaitAll 限定等待時間長度
View Code
10毫秒沒有完成任務,則輸出了****
通過取消標幟取消任務
通過取消標幟來中斷Task執行個體的執行。 CancellationTokenSource,CancellationToken下的IsCanceled屬性標誌當前是否已經被取消,取消任務,任務也不一定會馬上取消,下面貼代碼:
View Code
Task異常處理 當很多任務並行啟動並執行時候,可能會並行發生很多異常。Task執行個體能夠處理一組一組的異常,這些異常有System.AggregateException類處理
View Code
Task傳回值 Task<TResult>
View Code
通過延續串聯多個任務
ContinueWith:建立一個目標Task完成時,非同步執行的延續程式,await,如代碼所示:
View Code
TaskContinuationOptions
TaskContinuationOptions參數,可以控制延續另一個任的任務調度和執行的可選行為。下面看代碼:
View Code
TaskContinuationOptions 屬性有很多,如下所示
C#並行編程-Task