如何在没有使用C#超时的情况下查看数千个URL是否处于活动状态?

时间:2015-08-18 14:53:15

标签: c#

我的项目是在.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%的网址,他们会超时,我甚至没有机会获得状态代码。

有没有办法可以在没有超时的情况下更快地获取状态代码?

1 个答案:

答案 0 :(得分:1)

在我看来,你一次只运行一个URL,这在性能上并不是非常聪明。在此类流程完成之前,确实需要数小时。

您可以使用async Task来并行执行操作(并且可能Semaphone用于限制)。您可以在MSDN上找到有关它的更多信息。

您也可以将上述代码放在Parallel.ForEach中并立即运行64:

Parallel.ForEach
    ( listOfUrls
    , new ParallelOptions() { MaxDegreeOfParallelism = 64 }
    , url =>
        {
            // do your thing
        }
    );