Ich mache ein Tool zum Herunterladen von Bildern aus dem Internet gleichzeitig mit einem List<Uri>
und der WebClient
Klasse. Hier ist der relevante Code:WebClient nicht alle Dateien herunterladen, wenn eine Liste von Uris gegeben
Das neue WebClient, die ich benutze:
public class PatientWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest w = base.GetWebRequest(uri);
w.Timeout = Timeout.Infinite;
return w;
}
}
und die Download-Methoden:
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();
}
}
Das Problem ist, dass nicht alle Bilder aus der Liste _images
werden heruntergeladen. Wenn ich auf den Download-Knopf klicke, wird ein zweites Mal mehr heruntergeladen und es dauert ein paar Klicks, um alles runter zu bringen. Sind die WebClient
s abgelaufen, und wenn ja, gibt es eine Möglichkeit, sie den Download automatisch erneut zu versuchen? Wenn nicht, was ist der richtige Weg zur Lösung dieses Problems?
Versuchen Sie den Webclient mit Timeout zu erweitern. Der Webclient verfügt nicht über eine Zeitüberschreitungsfunktion. http://stackoverflow.com/questions/1789627/how-to-change-the-timeout-on-a-net-webclient-object. Du ignorierst auch wenn e.Error! = Null, was passiert da? –
@Stanley können Sie Ihre Frage klären? –
Fügen Sie einige Logging- oder 'Console.WriteLine'-Anweisungen hinzu, damit Sie wissen, was tatsächlich passiert. Schreiben Sie Ihre Zähler, Ihre Dateinamen, Ihre URLs und (wie @Stanley es vorschlägt) und Fehler aus den Ereignisargumenten aus. Versuchen Sie auch, 'fileString.Flush()' am Ende jedes 'DownloadCompleted'-Aufrufs hinzuzufügen. – mdisibio