我使用2个Parallel.ForEach
嵌套循环从网址快速检索信息。这是代码:
while (searches.Count > 0)
{
Parallel.ForEach(searches, (search, loopState) =>
{
Parallel.ForEach(search.items, item =>
{
RetrieveInfo(item);
}
);
}
);
}
外部ForEach
有一个列表,例如10,而内部ForEach
的列表为5.这意味着我将查询该网址50次,但是我查询同时5次(内部ForEach
)。
我需要为内循环添加一个延迟,以便在查询url之后,等待x秒 - 内循环完成5个请求所需的时间。
使用Thread.Sleep
并不是一个好主意,因为它会阻止整个线程以及其他并行任务。
是否有替代方案可行?
答案 0 :(得分:4)
根据我的理解,您有50个任务,并且您希望一次处理其中的5个任务。
如果是这样,你应该查看ParallelOptions.MaxDegreeOfParallelism来处理50个最大并行度为5的任务。当一个任务停止时,允许另一个任务启动。
如果您希望以五个块的形式处理任务,然后再处理另一个五个块(例如,您希望以串行方式处理块),那么您将需要类似于
的代码for(...)
{
Parallel.ForEach(
[paralleloptions,]
set of 5, action
)
}