.NET 4 引入 System.Threading.Tasks 命名空間,提供高階平行程式設計抽象,讓開發者專注業務邏輯而非執行緒管理細節。
| API | 用途 | 適用場景 |
|---|---|---|
Parallel.For | 平行 for 迴圈 | 索引ベース、CPU 密集運算 |
Parallel.ForEach | 平行 foreach | 集合遍歷、資料平行 |
Parallel.Invoke | 平行執行多個 Action | 獨立任務組合 |
Task | 非同步工作單元 (ThreadPool) | 排程、延續、取消、異常處理 |
PLINQ | 平行 LINQ to Objects | 記憶體內資料查詢加速 |
模擬工作:`Thread.Sleep(100ms)` × 20 次。循序耗時 ≈ 2000 ms。
var sw = Stopwatch.StartNew();
Parallel.For(0, 20, i => SimulateWork(i));
Console.WriteLine($"Parallel.For: {sw.ElapsedMilliseconds} ms");
// 輸出順序非決定性,耗時 ~300 ms (視核心數)
var data = Enumerable.Range(0, 20).ToList();
sw.Restart();
Parallel.ForEach(data, item => SimulateWork(item));
Console.WriteLine($"Parallel.ForEach: {sw.ElapsedMilliseconds} ms");
// 耗時 ~600 ms (含集合分區開銷)
sw.Restart();
Parallel.Invoke(
() => Task1(),
() => Task2(),
() => Task3()
);
Console.WriteLine($"Parallel.Invoke: {sw.ElapsedMilliseconds} ms");
// 三個 3 秒任務並行,總耗時 ~3 秒 (而非 9 秒)
var cts = new CancellationTokenSource();
var opts = new ParallelOptions {
CancellationToken = cts.Token,
MaxDegreeOfParallelism = 10 // 限制最大併發數
};
// 背景任務 3.5 秒後觸發取消
Task.Factory.StartNew(() => {
Thread.Sleep(3500);
cts.Cancel();
Console.WriteLine("Cancel triggered");
});
Parallel.Invoke(opts,
() => LongRunningTask(cts.Token, "Task1"),
() => LongRunningTask(cts.Token, "Task2")
);
void LongRunningTask(CancellationToken token, string name) {
while (!token.IsCancellationRequested) {
Console.WriteLine($"{name} - Thread:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
}
}
var numbers = Enumerable.Range(0, 100).ToList();
// 平行 + 保序
var multiplesOf10 = numbers.AsParallel().AsOrdered()
.Where(n => n % 10 == 0)
.ToList();
// 平行聚合
double avg = numbers.AsParallel().Average();
// 自訂平行聚合 (Map-Reduce 模式)
double customAvg = numbers.AsParallel().Aggregate(
seed: 0d,
// 每分區局部累加
(localSum, item) => localSum + item,
// 分區結果合併
(total, local) => total + local,
// 最終結果轉換
final => final / numbers.Count
);
Console.WriteLine($"Average: {avg}, Custom: {customAvg}"); // 皆為 49.5
Parallel Extensions Samples (MSDN) — 涵蓋進階排程、自訂分區、取消、進度報告等完整範例。