我最近刚刚将我的网站请求转换为异步,它的速度是以前的三倍,但我发现了一个缺点。让我解释一下,我对一个页面使用了 20 个不同的请求。加载页面时,我解析结果,并将它们添加到字典中,完成后我检查字典中的键,我提供了有关是否找到信息的信息。
现在在异步之前运行所有 20 个请求大约需要 30 秒。今天我在大约 7 秒内运行了 20 个请求,进步很大,但是......如果旧方法在第一个请求中找到信息,它会在 2 秒内完成。使用这种方法总是需要 7 秒。
找到信息后,我该怎么做才能正确完成所有事情?而不是做所有二十个请求。这是代码。
编辑我试图移除 WAITALL,但这让我的表现更差。
public decimal GetWebpage(string urltovisit, string visitorurl, string information)
{
List<HtmlDocument> htmllist = new List<HtmlDocument>();
System.Net.ServicePointManager.DefaultConnectionLimit = 10;
FetchPageDelegate del = new FetchPageDelegate(FetchPage);
List<IAsyncResult> results = new List<IAsyncResult>();
List<WaitHandle> waitHandles = new List<WaitHandle>();
_visitorUrl = visitorurl;
_theSearchedinformation = information;
for (int i = 0; i < 200; i += 10)
{
string url = urltovisit + i;
IAsyncResult result = del.BeginInvoke(url, null, null);
results.Add(result);
waitHandles.Add(result.AsyncWaitHandle);
}
WaitHandle.WaitAll(waitHandles.ToArray());
foreach (IAsyncResult async in results)
{
FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate;
//THIS FUNCTION PARSES AND ADDS THE RESULT TO A DICTIONARY
DocParser.StartParse(pagedelagate.EndInvoke(async));
if (GetPostion() != 201)
{ //ADD DATA TO DATABASE
InsertRankingData(DocParser.GetSearchResults(), _theSearchedinformation);
return GetPostion();
}
}
return 201;
}
那么我应该创建一个新的委托列表来运行解析并添加到字典的方法和类吗?或者我可以使用等待句柄来告诉结果已经找到吗?我真的在这里一无所知?