首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没完没了的循环继续创建新线程

没完没了的循环继续创建新线程
EN

Stack Overflow用户
提问于 2015-12-16 19:30:15
回答 1查看 97关注 0票数 1

我目前正在用C#编写一个基本的网页爬虫。它是多线程的,但是用当前的结构,它总是在一个无穷无尽的循环中创建线程。我应该在这段代码中更改什么:

爬虫:

代码语言:javascript
复制
public static void Start(Uri url)
    {
        if (!RobotsParser.IsDomainParsed(LinkParser.GetDomainUrl(url)))
        {
            RobotsParser.Parse(url);
        }

        if (!CrawlQueue.CrawledList.Contains(url) && RobotsParser.IsCrawlingAllowed(url.ToString()))
        {
            CrawlQueue.CrawledList.Add(url);
            CrawlQueue.QueueList.Remove(url);

            //Crawling logic happens here...
            CrawlQueue.Add(LinkParser.Find(doc, responseUri));
            }
        }
    }

LinkParser:

代码语言:javascript
复制
public static HashSet<Uri> Find(HtmlDocument doc, string url)
{
   //returns list of found urls
    return list;
}

队列(这就是问题所在)

代码语言:javascript
复制
internal static class CrawlQueue
{
    public static HashSet<Uri> QueueList = new HashSet<Uri>();
    public static HashSet<Uri> CrawledList = new HashSet<Uri>();

    private static void Start()
    {
        Parallel.ForEach(QueueList.ToList(), new ParallelOptions { MaxDegreeOfParallelism = 7 }, url =>
        {
            try { CrawlEngine.Start(url); }
            catch (Exception e) { Debug.WriteLine(url + " "+ e.ToString()); }
        });
    }

    public static void Add(HashSet<Uri> list)
    {
        int counter = 0;
        foreach (var site in list.Where(site => !QueueList.Contains(site)))
        {
            QueueList.Add(site);
            counter++;
        }

        if (counter >= 1)
        {
            Logging.Log(counter + " items added to crawling queue");
            Start();
        }
    }
}

当我在列表中工作时,我应该进行什么样的设计?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-16 19:37:20

产生许多线程的问题是对Start()的递归调用与Parallel.ForEach (阻塞调用)相结合。您应该使用类似于Task.Factory.StartNew()的方法,以便在运行子任务时允许对Start()的调用退出。您可能还需要重构代码才能返回结果任务,这样您就可以知道什么时候一切都完成了。

正如注释所提到的,您可能不需要阻塞多线程解决方案(应该使用非阻塞IO),但这是一个更大的变化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34320510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档