快速撰寫C#工作排程模型(Parallel.ForEach)
在之前的文章再論具總量控管之.NET非同步工作排程模型中,我展示了如何利用SemaphoreSlim撰寫具備工作排程的非同步多執行緒程式,但在某些情境裡面其實並不太需要這麼複雜的非同步程式碼。舉例來說,你可能需要批次的把幾千個、特定的小型檔案複製到某一個資料夾中,這時候你就會發現使用ForEach去進行逐一複製是一個慢到想哭的過程。
那麼.NET Framework 4.0之後推出的System.Threading.Tasks.Parallel.ForEach()靜態方法,是一個非常適合在這種批次情境下的快速多執行緒工作排程。由於程式碼實在簡單到爆炸,所以我就直接把程式碼寫在下方給大家自己意會即可。
//把你要進行的工作列入IEnumerable(T)裡面
System.Collections.Generic.List<string> oList = new System.Collections.Generic.List<string>()
{
"AAAAA",
"BBBBB",
"CCCCC",
"DDDDD",
"EEEEE",
"FFFFF"
};
//調用Tasks.Parallel幫你一行多工多執行緒化
System.Threading.Tasks.Parallel.ForEach(
//等待處理的工作佇列
oList,
//設定每次最大執行的數量
new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = 2 },
//Func委派(基本上這邊就寫每個幫你自動開出來的執行緒內要進行的程式,例如:複製檔案)
x => {
Console.WriteLine($"Now processing in {x}");
}
);
//等到上面執行緒內的工作全部完成,才會再繼續往下進行
Console.WriteLine("Completed!");
程式碼就這樣,簡單到爆炸吧!如果你的工作並非真的要絕對的非同步,例如複製大量的特定檔案、為所有的影像檔案加上浮水印,那麼這個寫法會是最單純且最好閱讀。