Laden...

Datei Download mit Fortschritts Anzeige

Erstellt von CyberHunter vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.953 Views
C
CyberHunter Themenstarter:in
131 Beiträge seit 2007
vor 16 Jahren
Datei Download mit Fortschritts Anzeige

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

W
32 Beiträge seit 2007
vor 16 Jahren

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

A
49 Beiträge seit 2007
vor 16 Jahren

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.

3.825 Beiträge seit 2006
vor 16 Jahren

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

A
49 Beiträge seit 2007
vor 16 Jahren

gut zu wissen =))

und ich depp rechne das immer selbst aus!

Thx Bernd

G
28 Beiträge seit 2007
vor 16 Jahren

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

K
593 Beiträge seit 2007
vor 16 Jahren

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

G
28 Beiträge seit 2007
vor 16 Jahren

k, verstehen tu ich es noch nicht, werde mich melden so bald ich das ganze begriffen und umgesetzt habe 🙂 Vielen Dank!

N
335 Beiträge seit 2006
vor 16 Jahren

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

D
7 Beiträge seit 2008
vor 16 Jahren

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?

X
1.177 Beiträge seit 2006
vor 16 Jahren

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.

J
12 Beiträge seit 2008
vor 16 Jahren

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.