2017-12-21 3 views
1

Ich habe eine C# WPF-Anwendung in C# erstellt. In meinem Code lade ich eine große Datei mit WebClient.DownloadFile aus dem Internet herunter.Wie zu stoppen C# -Anwendung Benutzeroberfläche reagiert nicht mehr beim Herunterladen einer großen Datei aus dem Internet

Wenn ich dies tue, reagiert die Benutzeroberfläche der Anwendung nicht mehr (die App nicht einfrieren, wenn ich es lange genug verlassen würde es heruntergeladen hätte und es geht wieder normal).

Der Code selbst befindet sich in einem anderen Skript, das vom UI-Thread aufgerufen wird. Wie kann ich verhindern, dass die Benutzeroberfläche nicht mehr reagiert?

+0

Die Antwort liegt auf der Hand, ist es nicht? Laden Sie die Datei in einen anderen Thread –

+1

Mit Multithreading. – waka

+3

Mögliches Duplikat von [Wie behalte ich eine reaktionsfähige Benutzeroberfläche während der Verarbeitung großer Datenmengen?] (Https://stackoverflow.com/questions/4539369/how-doi-i-keep-a-responsive-ui-while-processing - große Mengen von Daten) –

Antwort

7

Verwenden Sie die Methode WebClient.DownloadFileAsync, um die Datei in einem Worker-Thread herunterzuladen. Der UI-Thread bleibt während dieses Vorgangs aktiv.

Die Dokumentation Methode erklärt es schön:

Diese Methode lädt die Ressource auf den von den Parametern Adresse angegebenen URI. Wenn der Download erfolgreich abgeschlossen wurde, trägt die heruntergeladene Datei den Namen fileName auf dem lokalen Computer. Die Datei wird asynchron mit Thread-Ressourcen heruntergeladen, die automatisch aus dem Thread-Pool zugeordnet sind. Um die Benachrichtigung zu erhalten, wenn die Datei verfügbar ist, fügen Sie dem DownloadFileCompleted-Ereignis einen Ereignishandler hinzu.

Diese Methode blockiert den aufrufenden Thread nicht, während die Ressource heruntergeladen wird. Um zu blockieren, während auf den Download gewartet wird, verwenden Sie eine der DownloadFile-Methoden.

Sie können die CancelAsync-Methode verwenden, um asynchrone Vorgänge abzubrechen, die nicht abgeschlossen wurden.

-1

Verwendung so etwas wie dieses:

... //You earlier code 
await Task.Run(() => /*your large file downloading code */); 
...//Your later code 
+2

Task.Run sollte für CPU-gebundene Arbeit reserviert sein, nicht für IO gebundene Arbeit. Nur async/erwarten Sie, was Sie wollen. – Crowcoder

+0

@Crowcoder Es ist eine Best Practice-Methode, um Sync-Code mit async zu versehen, man. Lesen Sie mehr über async/erwarten Sie die Realisierung hier https://docs.microsoft.com/ru-ru/dotnet/standard/async-in-depth Sie werden sehen, dass in .NET async Methoden genau dieselben Mechanismen verwendet werden. – Dmitriy

+1

Ich habe es tatsächlich gelesen. Deshalb weiß ich, dass es verschwenderisch ist, IO-gebundenen Code in Task.Run auszuführen. Es gibt keinen Hinweis, dass OP hier auf synchronen Code beschränkt ist. – Crowcoder

Verwandte Themen