我想同時抓取幾個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