複数のURLを同時にクロールしようとしています。各リクエストは、クロールのためにさらに多くのURLをConcurrentBag
に追加することがあります。現時点では、新しいURLを処理するために新しいParallel.ForEach
を開始する厄介なwhile(true)があります。Parallel.ForEachに使用されているConcurrentBagにアイテムを追加する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;
}
再帰的コードに潜んでいると便利です。これが適用される典型的な例です。 Btw、循環参照に注意してください。 – Stefan
ありがとう、私はそれをチェックします! :-) – jamie