2013-10-15 73 views
0

我使用2 Parallel.ForEach嵌套循環快速檢索URL的信息。這是代碼:C#延遲Parallel.ForEach

while (searches.Count > 0) 
{ 
    Parallel.ForEach(searches, (search, loopState) => 
     { 
      Parallel.ForEach(search.items, item => 
       { 
        RetrieveInfo(item); 
       } 
      ); 
     } 
    ); 
} 

ForEach具有一個列表,例如10,同時內ForEach具有爲5的列表這意味着,我要查詢的URL的50倍,但是我同時查詢5次(內部ForEach)。

我需要爲內部循環添加延遲,以便在查詢url之後,它會等待x秒 - 內部循環完成5個請求所用的時間。

使用Thread.Sleep不是一個好主意,因爲它會阻塞完整的線程和可能的其他並行任務。

有沒有其他方法可行?

+5

這是害怕。你能解釋一下你的意思嗎?您希望內部循環在返回到外部之前等待?你意識到他們是平行的嗎?如果這就是你想要的..使他們同步.. –

+0

我理解它是正確的,在內部循環中的5只是一個例子,並沒有涉及到5個同時請求? – svick

回答

4

就我的理解,你有50個任務,你希望一次處理5個任務。

如果是這樣,您應該查看ParallelOptions.MaxDegreeOfParallelism以在5處最大並行度處理50個任務。當一個任務停止時,允許另一個任務啓動。

如果您希望在五大塊處理的任務,其次是五個另一塊(如,你想處理串行塊),那麼你會希望類似的代碼

for(...) 
{ 
    Parallel.ForEach(
     [paralleloptions,] 
     set of 5, action 
    ) 
} 
+0

現在我也跟蹤每個內部循環所用的時間,並且在外部循環完成後,我花費最快內部循環的時間,並使用Thread.Sleep等待。 –