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?
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
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 😦
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.
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 😦.
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.