文章出處

.Net Framework 里引入了并行編程,并行編程本質上還是多線程,只是微軟對此進行了封裝和優化,使用多線程編程變得更簡單,如下面一個例子:

for(var i = 0; i < 100000; i++)
{
    Console.WriteLine(string.Format("Work Item :", i));
}

如果把 100000 個工作項使用多個線程同時處理, 在以前還有點麻煩,現在就變得非常簡單:

Parallel.For(0, 100000, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面的代碼中, 程序會根據任務項數自動分區(分區大概的意思就是分成幾個線程來同時處理)。

 

我們可以設置 ParallelOptions 對象,來設置最多分幾個區, 如:

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 10; // 最多分十個區

Parallel.For(0, 100000, options, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

還可以通過 System.Collections.Concurrent.Partitioner 類來進行更細的分區設置, 如:

var parts = Partitioner.Create(0, 100000, 1000); // 1000 是指每個分區的元素數, 此行代碼將指示創建 100 個分區
Parallel.For(parts, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面這些分區,叫做靜態分區,就是分好區之后,每個區要處理的元素就已經全部確定好,但是有這種情況,如有些分區的任務很快就處理完了,有些分區的任務處理得
比較慢, 那么快的分區處理完分區的任務后沒有辦法幫助其他慢的分區處理任務,在這種情況下,又可以使用動態分區,具體實現方法可以參考微軟官網的例子:https://msdn.microsoft.com/zh-cn/library/dd997416(v=vs.110).aspx

 

還有一個 System.Collections.Concurrent.OrderablePartitioner 類,用來對可排序的數據源進行分區。

 

相關參考:

Parallel Processing and Concurrency in the .NET Framework

5天玩轉C#并行和多線程編程 —— 第一天 認識Parallel


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()