using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; class Program { static void Main() { List<string> imageUrls = new List<string>(); // 假設這個列表包含100個圖片地址 for (int i = 0; i < 100; i++) { imageUrls.Add($"http://example.com/image{i}.jpg"); } // 設定並行選項 ParallelOptions parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = 5 // 每次並行處理5張圖片 }; // 使用 Partitioner.Create 分割槽器來建立分割槽 var partitions = Partitioner.Create(imageUrls, true).GetPartitions(5); // 使用 Parallel.ForEach 並行處理分割槽 Parallel.ForEach(partitions, parallelOptions, partition => { using (partition) { while (partition.MoveNext()) { string imageUrl = partition.Current; ProcessImage(imageUrl); } } }); Console.WriteLine("All images processed."); } static void ProcessImage(string imageUrl) { // 這裡是處理圖片的邏輯 Console.WriteLine($"Processing image: {imageUrl}"); // 假設處理圖片需要一些時間 Task.Delay(500).Wait(); } }
程式碼解釋
-
建立圖片地址列表:
- 假設
imageUrls
包含100個圖片地址。
- 假設
-
設定並行選項:
MaxDegreeOfParallelism = 5
表示每次並行處理5個任務。
-
使用
Partitioner.Create
建立分割槽:Partitioner.Create(imageUrls, true).GetPartitions(5)
建立5個分割槽,每個分割槽處理部分圖片。
-
使用
Parallel.ForEach
並行處理分割槽:Parallel.ForEach
迭代分割槽,併為每個分割槽建立一個任務。- 在每個分割槽中,使用
partition.MoveNext()
迭代圖片地址並處理。
-
處理圖片的邏輯:
ProcessImage
方法包含具體的圖片處理邏輯,這裡用Task.Delay(500).Wait()
模擬處理時間。
這種方法確保了每次有最多5個圖片在並行處理,而不會超過這個數量。