2010-06-04 8 views
7

Ich verwende die DownloadFileAsync Methode von WebClient einige Dateien von einem Server herunterzuladen, und das kann ich in meiner informellen Prüfung meines Codes innerhalb VS2010, blockiert es für ca. 3 Sekunden nicht umhin zu bemerken, während er beginnt, die, Meiner Meinung nach macht die Art den Zweck zunichte.Ist WebClient.DownloadFileAsync wirklich so langsam?

Hier ist der relevante Code-Snippet:

WebClient downloader = new WebClient(); 
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(updateDownloadProgress); 
downloader.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadCompleted); 

var current_map = map_downloads[0];//string with filename, map_downloads is List<string> 

var path = System.IO.Path.GetTempFileName(); 

downloaded_maps.Add(path);//adding the temp file to a List<string> 

downloader.DownloadFileAsync(new Uri(MAP_BASE + current_map), path); //MAP_BASE is a string containing the base url 

ich DownloadFileAsync bin mit dem UI zu halten blockiert, während die Anwendung einer herunterlädt ~ 100 MB-Datei. Offensichtlich, wenn die UI 3 Sekunden lang blockiert, während der Anruf startet, verringert das den Nutzen etwas, wenn nicht sogar ganz.

Ich bin relativ unerfahren mit C# /. Net (Ich habe eine Menge .Net 2.0 Sachen vor etwa 3-4 Jahren, IIRC, aber ich bin im Grunde neu lernen es jetzt).

Antwort

0

Haben Sie herausgefunden, wenn die Verzögerung in Ihrer Anwendung ist, oder im Netzwerk? Um herauszufinden, ob der Zielserver langsam ist, führen Sie Wireshark aus, und sehen Sie, wann die erste Antwort empfangen wird, nachdem die Anfrage gesendet wurde. Vielleicht tritt die Verzögerung dort auf?

Auch wenn dieser Teil einer großen Anwendung ist, dann ist das erste Mal, immer langsam wegen Anlaufkosten. Wenn Sie wirklich eine gute Messung erhalten möchten, messen Sie die Gesamtzeit, die für den ersten Aufruf und für den zweiten bis zum zehnten Aufruf benötigt wird. Von diesem können Sie herausfinden, ob die Verzögerung in Startup-Kosten ist, oder jedes Mal.

7

habe ich irgendwo gelesen, dass DownloadFileAsync tatsächlich den DNS-Namen in einem blockierenden Thread überprüft, damit, warum Sie die Verlangsamung bekommen werden. Wenn Sie die IP direkt eingeben, sollte es keine Blockierung geben. Gefunden das Stück Infos hier: http://www.csharp-examples.net/download-files/

8

Zusätzlich zu dem, was Nav sagt, es sieht aus wie das Problem ist Web-Proxy automatische Erkennung finden Sie diese Antwort: Why is this WebRequest code slow?

ich es getestet und es funktioniert nun ohne wesentliche Verzögerung während des ersten Anrufs.

+0

Danke, das perfekt funktioniert! Für diejenigen, die gleiche Problem auftritt, nur die ‚Proxy‘ Eigenschaft auf null gesetzt ist webclient vor dem Download aufrufen. – Zoey

-1

in ASP.NET hat die Verwendung von async-Methode keine Bedeutung, wenn Thread Rolle von Aysnc-Methode erwartet.
Wenn ich anfangen webclient async es immer schließt sich, wenn der Haupt-Thread beendet (vor aspx Rendering).

große Artikel über das Thema: http://weblogs.asp.net/gunnarpeipman/archive/2010/09/07/making-asynchronous-calls-to-web-services-during-asp-net-page-processing.aspx

enter image description here

hier sind andere Informationen über sie: WebClient async callback not called in ASP.NET MVC