簡體   English   中英

通過N個並發線程並發處理對象集合

[英]Processing object collection concurrently by N simultaneous threads

我有一些物件。 我需要在單獨的線程中依次處理每個這些對象。 應該修復多個並發線程,例如4。考慮到我受3.5版.NET Framework的限制,最好的方法是什么?

編輯:“按順序”我的意思是在開始的第一個對象的處理應開始。 然后,在仍進行處理的同時,開始第二,第三和第四對象的處理。 第五個對象將等待這四個對象中的任何一個處理完成。 等等,但是,如果沒有第五個對象,則不能處理第六個對象。 您可能已經注意到某些下載管理器以這種方式工作。

我假設在您的描述中,如果第5項的過程開始,即使沒有完成,也可以處理第6項。

對於ConcurrentQueue<T>聽起來很自然,但這是4.0。

如果您取消了對IProducerConsumerCollection<T>的支持,則LLQueue可以移植到3.5,因為它是4.0,但是其余的應該可以在2.0以后的任何版本上運行。

然后只有4個(或多個線程),每個線程繼續調用TryDequeue直到返回false,如果返回true,則處理獲得的項。

您的問題讓我有些困惑。 我不知道您為什么要分四批處理?

此過程對4個批次並行。不保證該批次中的訂單。

public void ParallelOne()
    {
        int[] nums = Enumerable.Range(0, 8).ToArray();
        Debug.WriteLine(nums.Count().ToString() + " " + nums[nums.Count()-1].ToString());
        long total = 0;


        for (int k = 0; k < 2; k++)
        {
            total = 0;
            // Use type parameter to make subtotal a long, not an int
            Parallel.For<long>(k*4, (k+1)*4, () => 0, (j, loop, subtotal) =>
            {
                subtotal += nums[j];
                Debug.WriteLine(subtotal.ToString() + " " + j.ToString());
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

            Debug.WriteLine("The total is {0}", total);
        }

    }

如果要動態並行處理4個線程,則只需使用Paralled.ForEach並使用WithDegreeOfParallelism將踩踏速度限制為4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM