使用线程优化集合20个webrequests

时间:2012-11-04 16:27:08

标签: asp.net multithreading

这适用于ASP.NET。我想改善运行我的功能所需的时间,今天需要大约20-30秒,更多的是30秒而不是20秒。这是在一个线程上运行,制作了20个webrequests。

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


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

我最多制作了20个webRequests,至少为1.我已经将函数设置为在找到我正在搜索的信息时结束。有时信息不存在因此20个webrequests(它遍历所有数据)。

每个webrequest都会在字典中添加5-20个条目。然后将其与我发送给它的信息进行比较,如果它在列表中我得到了Key,否则返回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;
            }
        }
    }

1 个答案:

答案 0 :(得分: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