我想同时抓取几个URL。每个请求可能会将更多网址添加到ConcurrentBag
进行抓取。目前我有一个令人讨厌的(真),开始新的Parallel.ForEach
来处理任何新的URL。添加项目到ConcurrentBag用于Parallel.ForEach c#
是否有任何方法可以添加到ConcurrentBag
的内容中,因此Parallel.ForEach
会看到其中有新项目并继续迭代这些新项目?
ConcurrentBag<LinkObject> URLSToCheck = new ConcurrentBag<LinkObject>();
while (true)
{
Parallel.ForEach(URLSToCheck, new ParallelOptions { MaxDegreeOfParallelism = 5 }, URL =>
{
Checker Checker = new Checker();
URLDownloadResult result = Checker.downloadFullURL(URL.destinationURL);
List<LinkObject> URLsToAdd = Checker.findInternalUrls(URL.sourceURL, result.html);
foreach (var URLToAdd in URLsToAdd)
{
URLSToCheck.Add(new LinkObject { sourceURL = URLToAdd.sourceURL, destinationURL = URLToAdd.destinationURL });
}
});
if(URLSToCheck.Count == 0)break;
}
潜入递归代码可能会有帮助。这是一个适用的典型例子。顺便说一句,谨防循环引用。 – Stefan
谢谢我会检查出来! :-) – jamie