[英]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.