Я пытаюсь создать консольное приложение на c #, которое будет отслеживать около 3000 URL-адресов (просто нужно знать, что запрос HEAD вернул 200, необязательно содержимое и т. Д.)
Моя попытка заключалась в том, чтобы создать подпрограмму, проверяющую веб-URL, зацикливание и создание потоков, каждый из которых выполняет подпрограмму. Происходит следующее: если я запускаю с <20 потоками, большую часть времени он работает нормально, но если я использую> 20 потоков, некоторые из них истекают. Я попытался увеличить время ожидания до 30 секунд, то же самое происходит. Сеть, в которой я работаю, более чем способна выполнить 50 запросов HTTP HEAD (соединение 10 Мбит / с у провайдера Интернет-услуг), и при выполнении подпрограммы и процессор, и сеть работают очень слабо.
Когда происходит тайм-аут, я проверяю тот же IP в браузере, и он работает нормально, я неоднократно проверял это, и во время тестирования никогда не было случая, чтобы истек срок ожидания по URL-адресу "time-out".
Причина, по которой я хочу запустить> 20 потоков, состоит в том, что я хочу выполнять этот тест каждые 5 минут, при этом некоторые URL-адреса занимают полные 10 секунд (или выше, если время ожидания установлено выше), я хочу убедиться, что Он может работать через все URL в течение 2-3 минут.
Есть ли лучший способ проверить, доступен ли URL-адрес, или, если я смотрю на систему / сеть на предмет проблемы.
MAIN
while (rdr.Read())
{
Thread t = new Thread(new ParameterizedThreadStart(check_web));
t.Start(rdr[0]);
}
static void check_web(object weburl)
{
bool isok;
isok = ConnectionAvailable(weburl.ToString());
}
public static bool ConnectionAvailable(string strServer)
{
try
{
strServer = "http://" + strServer;
HttpWebRequest reqFP = (HttpWebRequest)HttpWebRequest.Create(strServer);
reqFP.Timeout = 10000;
reqFP.Method = "HEAD";
HttpWebResponse rspFP = (HttpWebResponse)reqFP.GetResponse();
if (HttpStatusCode.OK == rspFP.StatusCode)
{
Console.WriteLine(strServer + " - OK");
rspFP.Close();
return true;
}
else
{
Console.WriteLine(strServer + " Server returned error..");
rspFP.Close();
return false;
}
}
catch (WebException x)
{
if (x.ToString().Contains("timed out"))
{
Console.WriteLine(strServer + " - Timed out");
}
else
{
Console.WriteLine(x.Message.ToString());
}
return false;
}
}