0

这适用于 ASP.NET。我想改进运行我的功能所花费的时间,今天大约需要 20-30 秒,但更多的是 30 秒而不是 20 秒。它在一个线程上运行,发出 20 个网络请求。

我正在考虑执行所有 20 个 webreqeusts 的线程,以便快速找到结果或只是浏览数据(IE 执行所有 20 个请求,但没有找到任何东西)。


这是它的工作原理。
1. 我正在使用 html 敏捷包来获取 htmldocuments。
2. 然后我解析它们以获取信息
3. 最后我将该信息添加到字典中,或者我继续下一个 webrequest,直到达到 20 个请求。

我最多发出 20 个 webRequest,至少 1 个。我已将功能设置为在找到我正在搜索的信息时结束。有时信息不存在,因此有 20 个网络请求(它遍历所有数据)。

每个 webrequest 都会在字典中添加 5-20 个条目。然后将其与我发送给它的信息进行比较,如果它在列表中,我将返回密钥,否则返回 201。如果找到,则将其添加到数据库中。

问题

*A:*如果我想用线程来做这个,我应该创建多少?20 每个请求一个,让他们都松手去做这项工作?或者我应该创建 4 个,每个最多 5 个请求?

B:如果两个线程同时完成并想向目录中添加信息,是否可以锁定整个站点(我使用的是ASP.NET),或者它会尝试从线程A添加一个然后添加一个线程 B 的结果?我今天已经有一个检查,在添加之前检查密钥是否存在。

C:最快的方法是什么?

这是我的代码,描述了只显示 20 个请求的循环?

public void FetchAndParseAllPages()
    {

        int _maxSearchDepth = 200;
        int _searchIncrement = 10;

        PageFetcher fetcher = new PageFetcher();
        for (int i = 0; i < _maxSearchDepth; i += _searchIncrement)
        {
            string keywordNsearch = _keyword + i;
            ParseHtmldocuments(fetcher.GetWebpage(keywordNsearch));

            if (GetPostion() != 201)
            {   //ADD DATA TO DATABASE
                InsertRankingData(DocParser.GetSearchResults(), _theSearchedKeyword);
                return;
            }
        }
    }
4

1 回答 1

2
  1. .NET 只允许同时打开 2 个请求。如果你想要更多,你需要在 web.config 中配置它。看这里:http: //msdn.microsoft.com/en-us/library/aa480507.aspx

  2. 您可以使用Parallel.For非常简单的方法并为您处理“多少线程”。当然你可以调整它来设置你想要多少线程(或任务)ParallelOptions。看这里:http: //msdn.microsoft.com/en-us/library/dd781401.aspx

  3. 要制作线程安全字典,您可以使用ConcurrentDictionary. 看这里:http: //msdn.microsoft.com/en-us/library/dd287191.aspx

于 2012-11-04T16:45:15.257 回答