使用 Parallel.ForEach 結合 Partitioner.Create 來實現每次並行處理5張圖片的邏輯。下面是一個示例程式碼,演示如何實現這種並行處理。

星辰与大海發表於2024-07-24
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();
    }
}

程式碼解釋

  1. 建立圖片地址列表

    • 假設 imageUrls 包含100個圖片地址。
  2. 設定並行選項

    • MaxDegreeOfParallelism = 5 表示每次並行處理5個任務。
  3. 使用 Partitioner.Create 建立分割槽

    • Partitioner.Create(imageUrls, true).GetPartitions(5) 建立5個分割槽,每個分割槽處理部分圖片。
  4. 使用 Parallel.ForEach 並行處理分割槽

    • Parallel.ForEach 迭代分割槽,併為每個分割槽建立一個任務。
    • 在每個分割槽中,使用 partition.MoveNext() 迭代圖片地址並處理。
  5. 處理圖片的邏輯

    • ProcessImage 方法包含具體的圖片處理邏輯,這裡用 Task.Delay(500).Wait() 模擬處理時間。

這種方法確保了每次有最多5個圖片在並行處理,而不會超過這個數量。

相關文章