我有一個對象集合。我需要按順序逐個處理這些對象中的每個對象。許多併發線程應該是固定的,比如說4.由於受到3.5版.NET Framework的限制,最好的方法是什麼?同時處理N個併發線程的對象集合
編輯:「按順序」我的意思是在開始處理第一個對象應該開始。然後,當它仍然處理時,第二,第三和第四個對象的處理開始。第五個對象將等待這四個對象中的任何一個處理完成。等等 但是,如果第五個對象不能被處理,第六個對象不能被處理。 您可能已經注意到一些下載管理器以這種方式工作。
我有一個對象集合。我需要按順序逐個處理這些對象中的每個對象。許多併發線程應該是固定的,比如說4.由於受到3.5版.NET Framework的限制,最好的方法是什麼?同時處理N個併發線程的對象集合
編輯:「按順序」我的意思是在開始處理第一個對象應該開始。然後,當它仍然處理時,第二,第三和第四個對象的處理開始。第五個對象將等待這四個對象中的任何一個處理完成。等等 但是,如果第五個對象不能被處理,第六個對象不能被處理。 您可能已經注意到一些下載管理器以這種方式工作。
我假設在項目6的描述中沒有問題,即使項目5的過程已經開始,即使未完成,也要處理。
聽起來像ConcurrentQueue<T>
的自然工作,但這是4.0。
LLQueue可以移植到3.5,如果你切出支持IProducerConsumerCollection<T>
,因爲這是4.0,但剩下的應該從2.0高達上的任何運行。
然後只有4個(或者說很多)線程,每個線程繼續調用TryDequeue
直到它返回false,並且返回true,然後處理獲得的項目。
你的問題對我有點困惑。我不知道你爲什麼要分批處理4?
此過程並行批量爲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);
}
}
如果你想與四線程動態並行就用Paralled.ForEach和使用WithDegreeOfParallelism到油門踏板到4
線程安全隊列是不錯..我不知道是否有一個背TPL的(部分)端口? – 2012-08-28 22:33:52
如果他們需要「按順序」和「一個一個」,如何通過多個線程更有效地完成這項工作? – spender
請說明「按順序」的含義。你的意思是你的最終結果必須包含正在處理的項目,它們是按照它們最初發生的順序進行處理的,還是說它們需要按照特定的標準進行排序? – JamieSee