Hallo zusammen,
Ich lade in meiner Anwendung auf Knopfdruck eine Datei von einer url Herunterladen.
Dies mache ich mit Hilfe der 'System.Net.WebClient' Klasse mit der Methode 'DownloadFile'
Gibt es eine möglichkeit dazu eine Fortschrittsanzeige zu realisieren bzw. wie wird sowas in der Regel umgesetzt?
Danke für eure Hilfe
CyberHunter
habs noch nie gemacht, deswegen weiss ich nicht ob es was vorgefertigtes gibt.
der Ansatz, von dem ich sicher bin, dass er funktionieren kann
größe der herunterzuladenden Datei am Server / größe temporären Datei am Client * 100
das ergibt deinen Fortschritt in Prozent,
und das wendest jetzt auf ne Progressbar an
"Arbeit ist die altmodische Form der Vermögensbildung in Arbeitnehmerhand."
Wolfram Weidner (*1925), dt. Journalist
Ich hab das so gelöst:
Größe der Datei / 100, damit bekommst du 1%schritte
und immer wenn du 1% runtergeladen hast, machst du
progressBar1.increment(GrößederDatei/100);
musst natürlich dafür wissen wieviel du schon runtergeladen hast und wie groß die datei insgesamt ist.
Das gibts schon fertig in .NET 2.0.
Such nach "WebClient".
Datei im Hintergrund laden und Fortschritt in % anzeigen geht dann so :
WebClient client = new WebClient();
client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
client.DownloadFileAsync(new Uri(url), zipfile);
...
private void DownloadProgressChanged(Object sender, DownloadProgressChangedEventArgs e)
{
toolStripStatusLabel3.Text = "Download Update " + e.ProgressPercentage.ToString() + "%";
}
private void DownloadFileCompleted(Object sender, AsyncCompletedEventArgs e)
{
...
}
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
gut zu wissen =))
und ich depp rechne das immer selbst aus!
Thx Bernd
sry wenn ich den Thread hier nochmals hervorhole, ich weiss wie alt dieser ist.
Allerdings betrifft meine Frage genau die hier besprochene Sache.
Und zwar hätte ich auch gerne eine Fortschrittsanzeige beim download von Dateien, der WebClient hierfür ist erstellt, allerdings werden die Dateien in einem eigenen Thread heruntergeladen.
Das ist wahrscheinlich der Grund wieso die Funktion während des ganzen Downloads nicht reagiert.
void DownloadClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
percentage_active_download.Text = "Download Update " + e.ProgressPercentage.ToString() + "%";
}
Ich initialisiere den WebClient:
private WebClient DownloadClient = new WebClient();
und im Konstruktor nehme ich noch folgende Einstellungen vor:
//Konfiguriert den DownloadClient
DownloadClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadClient_DownloadProgressChanged);
Wie bereits gesagt Downloade ich nachher mittels eines Backgroundworkers (und WebClient) gewisse Dateien aus dem Internet, allerdings reagiert die Funktion "DownloadProgressChanged" nicht.
Könnt ihr mir vielleicht ein weiteres Vorgehen empfehlen?
Vielen Dank fürs Lesen
mfg - garden
Hi garden,
wenn du das in einen eigenen Thread ausgliederst dann musst du mit delegates arbeiten und per Invoke die Delegates aufrufen und dann mit Dateigröße den Prozentualen fortschritt übergeben. Ich hoffe es ist klar geworden was ich meine 🙂
Gruß Daniel
k, verstehen tu ich es noch nicht, werde mich melden so bald ich das ganze begriffen und umgesetzt habe 🙂 Vielen Dank!
Hallo garden,
Was Kaji dir beschrieben hat, gibt es in diesem FAQ-Eintrag von herbivore schön erklärt:
[FAQ] Warum blockiert mein GUI?
Mfg NeuroCoder
Ich habe auch mal eine Frage dazu:
Auch wenn das der eigentlichen Idee des asynchronen Down-/Uploads widerspricht würde ich gerne folgendes machen:
Während des Transfervorgangs eine Statusbar anzeigen (das funktioniert wie beschrieben) aber während des Downloads KEINEN weiteren Code ausführen, denn das macht in meinem Programm erst nach beendetem Down-/Upload Sinn.
Ich könnte die Datei natürlich auch synchron transferieren aber dann blockiert die GUI und ich kann keinen Fortschritt anzeigen lassen.
Hat da jemand eine Idee?
Während des Transfervorgangs eine Statusbar anzeigen [..] aber während des Downloads KEINEN weiteren Code ausführen
Also, prinzipiell widerspricht sich das ein wenig, da ja jeder refresh deiner Gui Code ausführt.
Die einzige Möglichkeit welche mir da einfällt ist alle Eingabemöglichkeiten für den User verbieten. Also alle Buttons, Eingabefelder usw. auf disabled stellen. Ansonsten würde dein Benutzer ja auch das Fenster nicht minimieren können, bzw. den Download abbrechen dürfen.
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Hallo,
wenn Ich mich recht erinnere, musst du die DownloadFileAsync-Methode des WebClient benutzen, damit das DownloadProgressChanged-Event ausgelöst wird. Hierbei wird der aufrufende Thread auch nicht blockiert.