2013-10-15 48 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等待。 –