我有一个功能:
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,它就会停止工作。
答案 0 :(得分:2)
您没有处置您的回复,因此您永远不会将连接返回到连接池 - 如果您从同一主机获取多个图像,则连接池会阻止您打开与该主机的更多连接等待现有的退货。只要确保你处理回复:
using (var response = (HttpWebResponse) request.GetResponse())
{
return response.StatusCode == HttpStatusCode.OK;
}
虽然我不得不说,每张图片发出两个请求似乎毫无意义 - 一个只是为了检查它是否存在,然后是另一个来获取实际数据。我只是尝试下载每个文件,并处理由于它不存在而导致下载失败的情况。