Код перестает работать в середине процесса без ошибок
У меня есть функция:
public bool urlExists(string url)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return (response.StatusCode == HttpStatusCode.OK);
}
catch (Exception ex)
{
Console.WriteLine("false");
return false;
}
}
Который проверяет, существует ли URL или нет. И у меня есть еще одна функция для загрузки файлов.
public void downloadImages(string imgCode)
{
using (WebClient wc = new WebClient())
{
try
{
if (urlExists("mydomain.com/images/" + imgCode + "/large.png"))
{
= wc.DownloadFile("mydomain.com/images/" + imgCode + "/large.png", "filepath" + imgCode + ".png");
}
if (urlExists("mydomain.com/images/" + imgCode + "/large.jpg"))
{
wc.DownloadFile("mydomain.com/images/" + imgCode + "/large.jpg", "filepath" + imgCode + ".jpg");
}
System.Threading.Thread.Sleep(1000);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
У меня есть список 'imgCodes', и я вызываю функцию следующим образом:
for (int i = 0; i < imgCodes.Count; i++)
{
downloadImages(imgCodes[i]);
}
Программа начинает работать, но в середине процесса она останавливается и по какой-то причине существует поток. Я попытался добавить несколько строк, чтобы выяснить, где возникает проблема, но я не смог выяснить... но самое близкое, что я получил, это то, что это может быть связано с переключением с одного формата на другой.
Например, если он загружает PNG, а следующее изображение является JPG, он перестает работать и существует поток. Или, если он загружает jpb и следующее изображение png, он перестает работать.
1 ответ
Вы не утилизируете свои ответы, поэтому вы никогда не возвращаете соединения в пул соединений - если вы выбираете несколько изображений с одного хоста, пул соединений не позволяет вам открывать больше соединений с этим хостом, ожидая существующие должны быть возвращены. Просто убедитесь, что вы распоряжаетесь ответом:
using (var response = (HttpWebResponse) request.GetResponse())
{
return response.StatusCode == HttpStatusCode.OK;
}
Хотя я должен сказать, что бессмысленно делать два запроса на изображение - один просто для проверки того, существует ли он, а другой для получения реальных данных. Я просто попытался бы загрузить каждый файл и обработать случай, когда загрузка не удалась из-за того, что он не существует.