Laden...

WPF Window "freezed" bei WebClient.downloadFile()

Erstellt von IgG vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.422 Views
I
IgG Themenstarter:in
111 Beiträge seit 2006
vor 16 Jahren
WPF Window "freezed" bei WebClient.downloadFile()

Ich habe eine WPF Anwendung welche Dateien runterlädt. Allerdings habe ich das (bisher) nicht mit Threads gelöst und nun ist es leider so, dass beim Aufruf der Methode WebClient.downloadFile() die gesamte Anwendung bis zum Ende des Downloads steht.

Ich habe es auch schon mit folgendem Code versucht:


System.Windows.Controls.Grid progressView = (System.Windows.Controls.Grid) mainWindow.FindName("ProgressView");
progressView.Visibility = System.Windows.Visibility.Visible;
mainWindow.UpdateLayout();
progressView.UpdateLayout();
downloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloadClient_DownloadProgressChanged);
downloadClient.DownloadFile(uri, destinationConfigurationFile);


public void downloadClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
System.Windows.Controls.ProgressBar progressBar = (System.Windows.Controls.ProgressBar) mainWindow.FindName("ProgressBar");
progressBar.Value = e.ProgressPercentage;
mainWindow.UpdateLayout();
}

Aber das Fenster wird einfach nicht neu gezeichnet und bleibt weiß, bis der Download abgeschlossen ist.

Jemand eine Idee?

F
23 Beiträge seit 2007
vor 16 Jahren

Hi IgG,

das liegt wahrscheinlich daran, dass DownloadFile solange den Thread blockiert, bis der Download fertig ist.
Versuch mal, den Download in einem Background-Worker Thread zu machen oder einen asynchrone Aufruf zu machen, falls Begin... End... Methode vorhandne sind.

Florian

www.planet-xaml.net

I
IgG Themenstarter:in
111 Beiträge seit 2006
vor 16 Jahren

Original von fkruesch
das liegt wahrscheinlich daran, dass DownloadFile solange den Thread blockiert, bis der Download fertig ist.
Versuch mal, den Download in einem Background-Worker Thread zu machen oder einen asynchrone Aufruf zu machen, falls Begin... End... Methode vorhandne sind.

Gerade das mit einem weiteren Thread wollte ich vermeiden, weil nach dem Ausführen des Downloads ein Codestück kommt welches die Dateien kopiert. Deswegen habe ich versucht bei jedem DownloadProgressChanged das Window mit UpdateLayout(); neu zu zeichnen.

Aber ich befürchte zunehmend dass es nicht anders geht 😦

6.862 Beiträge seit 2003
vor 16 Jahren

Die Problematik ist die gleiche wie schon in Windows Forms. Wenn du ne blockierende Operation hast im GUI Thread dann kann sich die Oberfläche einfach net aktuaisieren.

Aber du musst nicht händisch nen Thread erstellen, WebClient bietet mit DownloadFileAsync doch schon die Möglichkeit nichtblockierend eine Datei runterzuladen.

Baka wa shinanakya naoranai.

Mein XING Profil.

I
IgG Themenstarter:in
111 Beiträge seit 2006
vor 16 Jahren

Bei den Windows.Forms Fenstern konnte ich das Problem immer damit umgehen, dass ih mit window.Refresh() das Fenster neu zeichnen ließ. Bei WPF bewirkt das window.UpdateLayout() leider nicht das gleiche 😦.

6.862 Beiträge seit 2003
vor 16 Jahren

WPF hat auch nen ganz anderes Zeichenkonzept als Windows Forms. Du kannst unter WPF gar nicht so einfach ein neuzeichnen erzwingen, weil WPF das selber entscheidet wann gezeichnet wird. Das UpdateLayout zwingt nicht notwendigerweise zum Neuzeichnen.

Die sauberste Variante ist auch unter WindowsForms schon einfach einen extra Thread zu verwenden, bzw. wenn schon entsprechende Funktionen angeboten werden, diese asynchron aufzurufen.

Baka wa shinanakya naoranai.

Mein XING Profil.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Einfach DownloadFileAsync() verwenden und gut ist.