这适用于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;
}
}
}
答案 0 :(得分:2)
.NET只允许同时打开2个请求。如果您需要更多,则需要在web.config中进行配置。请看这里:http://msdn.microsoft.com/en-us/library/aa480507.aspx
您可以使用非常简单的Parallel.For
方法来处理“多少线程”。当然,您可以通过调整它来设置ParallelOptions
所需的线程数(或任务数)。请看这里:http://msdn.microsoft.com/en-us/library/dd781401.aspx
要制作线程安全字典,您可以使用ConcurrentDictionary
。请看这里:http://msdn.microsoft.com/en-us/library/dd287191.aspx