Я делаю инструмент для загрузки изображений из Интернета одновременно с использованием List<Uri>
и класса WebClient
. Вот соответствующий код:WebClient не загружает все файлы при предоставлении списка Uris
Новый WebClient, что я использую:
public class PatientWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest w = base.GetWebRequest(uri);
w.Timeout = Timeout.Infinite;
return w;
}
}
и методах загрузки:
public static void DownloadFiles()
{
string filename = string.Empty;
while (_count < _images.Count())
{
PatientWebClient client = new PatientWebClient();
client.DownloadDataCompleted += DownloadCompleted;
filename = _images[_count].Segments.Last().ToString();
if (!File.Exists(_destinationFolder + @"\" + filename))
{
try
{
client.DownloadDataAsync(_images[_count], _images[_count]);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
++_count;
}
}
private static void DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
if (e.Error == null)
{
Uri uri = (Uri)e.UserState;
string saveFilename = uri.Segments.Last().ToString();
byte[] fileData = e.Result;
if (saveFilename.EndsWith(".jpg") || saveFilename.EndsWith(".png") || saveFilename.EndsWith(".gif"))
using (FileStream fileStream = new FileStream(_destinationFolder + @"\" + saveFilename, FileMode.Create))
fileStream.Write(fileData, 0, fileData.Length);
else
using (FileStream fileStream = new FileStream(_destinationFolder + @"\" + saveFilename + ".jpg", FileMode.Create))
fileStream.Write(fileData, 0, fileData.Length);
++_downloadedCounter;
((WebClient)sender).Dispose();
}
}
Вопрос заключается в том, что не все изображения из списка _images
загружаются. Если я нажму кнопку загрузки, второй раз будет загружен, и на самом деле потребуется несколько щелчков мыши, чтобы сбить все. Вывод времени WebClient
, и если да, то есть способ заставить их автоматически повторить загрузку? Если нет, то каков правильный способ решения этой проблемы?
Попробуйте расширить веб-клиент с таймаутом. Webclient не имеет возможности для тайм-аута. http://stackoverflow.com/questions/1789627/how-to-change-the-timeout-on-a-net-webclient-object. Вы также игнорируете, если e.Error! = Null, что там происходит? –
@ Стэнли, не могли бы вы уточнить свой вопрос? –
Добавьте некоторые записи или 'Console.WriteLine', чтобы вы знали, что на самом деле происходит. Выпишите свои счетчики, имена ваших файлов, ваш url и (как предлагает @Stanley) и Error from event args. Кроме того, попробуйте добавить 'fileString.Flush()' в конец каждого вызова 'DownloadCompleted'. – mdisibio