我的项目是在.NET 4.5下。我的目标是获取大约7000个URL的状态代码,并将URL和状态代码放在数据库的表中。
大多数网址的代码运行正常(其中10%会超时),但运行需要几个小时(4-7小时)。
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(originalURL);
request.Method = "HEAD";
request.Timeout = 2000;
_Response = (HttpWebResponse)request.GetResponse();
int statusCode = -1;
if (originalURL != destURL)
{
statusCode=GetDestinationURLStatusCode(destURL);
}
statusCode = (int)_Response.StatusCode;
_Response.Close();
return statusCode;
}
catch(WebException webEx)
{
int statusCode = 0;
if(webEx.Status==WebExceptionStatus.ProtocolError)
{
statusCode = (int)((HttpWebResponse)webEx.Response).StatusCode;
}
_Response.Close();
return statusCode;
}
catch(Exception ex)
{
_Response.Close();
return -1;
}
我尝试将超时设置为较小,例如500,超过80%的网址,他们会超时,我甚至没有机会获得状态代码。
有没有办法可以在没有超时的情况下更快地获取状态代码?
答案 0 :(得分:1)
在我看来,你一次只运行一个URL,这在性能上并不是非常聪明。在此类流程完成之前,确实需要数小时。
您可以使用async Task
来并行执行操作(并且可能Semaphone
用于限制)。您可以在MSDN上找到有关它的更多信息。
您也可以将上述代码放在Parallel.ForEach
中并立即运行64:
Parallel.ForEach
( listOfUrls
, new ParallelOptions() { MaxDegreeOfParallelism = 64 }
, url =>
{
// do your thing
}
);