2012-08-28 81 views
0

我有一個對象集合。我需要按順序逐個處理這些對象中的每個對象。許多併發線程應該是固定的,比如說4.由於受到3.5版.NET Framework的限制,最好的方法是什麼?同時處理N個併發線程的對象集合

編輯:「按順序」我的意思是在開始處理第一個對象應該開始。然後,當它仍然處理時,第二,第三和第四個對象的處理開始。第五個對象將等待這四個對象中的任何一個處理完成。等等 但是,如果第五個對象不能被處理,第六個對象不能被處理。 您可能已經注意到一些下載管理器以這種方式工作。

+0

線程安全隊列是不錯..我不知道是否有一個背TPL的(部分)端口? – 2012-08-28 22:33:52

+4

如果他們需要「按順序」和「一個一個」,如何通過多個線程更有效地完成這項工作? – spender

+1

請說明「按順序」的含義。你的意思是你的最終結果必須包含正在處理的項目,它們是按照它們最初發生的順序進行處理的,還是說它們需要按照特定的標準進行排序? – JamieSee

回答

0

我假設在項目6的描述中沒有問題,即使項目5的過程已經開始,即使未完成,也要處理。

聽起來像ConcurrentQueue<T>的自然工作,但這是4.0。

LLQueue可以移植到3.5,如果你切出支持IProducerConsumerCollection<T>,因爲這是4.0,但剩下的應該從2.0高達上的任何運行。

然後只有4個(或者說很多)線程,每個線程繼續調用TryDequeue直到它返回false,並且返回true,然後處理獲得的項目。

0

你的問題對我有點困惑。我不知道你爲什麼要分批處理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