首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Parallel Extensions 入門實戰:用 .NET 4 建構多核心應用程式

     編輯:關於.NET

實驗目標

  • 使用 Parallel 靜態類別平行化既有演算法
  • 建立並執行可取消的平行工作
  • 使用 Task<T> 取得回傳值
  • 以 PLINQ 優化 LINQ 查詢於平行環境執行

練習一:Parallel 靜態輔助類別平行化演算法

任務 1:模擬長時間服務呼叫

預設資料類別 EmployeeList、服務 PayrollServices.GetPayrollDeduction() 模擬耗時運算。

任務 2:序列 for 迴圈基準測試

for (int i = 0; i < employeeData.Count; i++)
{
    decimal span = PayrollServices.GetPayrollDeduction(employeeData[i]);
}

輸出依序處理,總耗時約等於單項耗時總和。

任務 3:Parallel.For 一鍵平行化

Parallel.For(0, employeeData.Count, i =>
{
    decimal span = PayrollServices.GetPayrollDeduction(employeeData[i]);
});

Lambda 表達式取代迴圈主體。執行順序非固定,多核心並行,總耗時大幅縮短(雙核心約減半)。

序列輸出 Parallel.For 輸出

任務 4:Parallel.ForEach 平行化 foreach

Parallel.ForEach(employeeData, ed => { ... });

同樣獲得平行效能提升。

任務 5:Parallel.Invoke 平行化樹狀遍歷

Parallel.Invoke(
    () => WalkTree(node.Left),
    () => WalkTree(node.Right)
);

遞迴分支並行執行,總時間顯著降低。

平行樹遍歷輸出

練習二:建立與執行平行工作

Task 基礎操作

var task1 = Task.Factory.StartNew(() => PayrollServices.GetPayrollDeduction(employeeData[0]));

等待完成:Wait() / WaitAll()

task1.Wait();
Task.WaitAll(task1, task2, task3);

主執行緒阻塞直到所有工作完成,比 ThreadPool.QueueUserWorkItem + 手動事件更簡潔。

輪詢完成狀態:IsCompleted

while (!task1.IsCompleted) { Thread.Sleep(1000); }

適用於需在工作完成前執行其他邏輯的場景。

串接工作:ContinueWith()

Task.Factory.StartNew(...)
    .ContinueWith(...)
    .ContinueWith(...);

保證執行順序,最後 Wait() 等待鏈尾。

練習三:Task<T> 取得回傳值

var task = Task.Factory.StartNew(() => PayrollServices.GetPayrollDeduction(employeeData[0]));
decimal result = task.Result;   // 若未完成則阻塞直到完成

適合「先啟動、稍後取值」模式。

練習四:PLINQ 平行化 LINQ 查詢

靜態方法風格

var q = ParallelEnumerable.Select(
    ParallelEnumerable.OrderBy(
        ParallelEnumerable.Where(employeeData.AsParallel(), x => x.EmployeeID % 2 == 0),
        x => x.EmployeeID),
    x => PayrollServices.GetEmployeeInfo(x)).ToList();

擴充方法風格(推薦)

var q = employeeData.AsParallel()
    .Where(x => x.EmployeeID % 2 == 0)
    .OrderBy(x => x.EmployeeID)
    .Select(x => PayrollServices.GetEmployeeInfo(x))
    .ToList();

僅在資料源加 .AsParallel() 即可平行化,語法極簡。

查詢理解語法

var q = from e in employeeData.AsParallel()
        where e.EmployeeID % 2 == 0
        orderby e.EmployeeID
        select PayrollServices.GetEmployeeInfo(e);

平行執行順序不固定,效能顯著提升(雙核心約快一倍)。

PLINQ 查詢理解語法輸出

總結與資源

  • 掌握 Parallel、Task、PLINQ 三大核心
  • 流程控制:Wait/WaitAll/IsCompleted/ContinueWith
  • 進階學習:PFX Team Blog、平行運算論壇、平行運算開發人員中心
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved