2012-09-26 13 views
5

Problem: Ich muss Hunderte von Bildern von verschiedenen Hosts herunterladen. Jeder Host hat irgendwo zwischen 20 und Hunderte von Bildern.Ist WebClient der beste Weg, um http-Daten herunterzuladen?

Lösung: Verwendung eines new WebClient jedes Mal, wenn ein Bild über die Methode DownloadData des WebClient heruntergeladen werden muss.

Oder wäre es besser, einen Pool von offenen Socket-Verbindungen zu halten und die http-Anfrage mit niedrigeren Ebenen Anrufe machen?

Ist es teuer, eine TCP-Verbindung zu öffnen/zu schließen (ich nehme an, dass das der WebClient tut), so dass die Verwendung von Pools effizienter klingt?

+0

Der beste Code ist Code, der Ergebnisse erzielt, die Sie brauchen, ohne Fehler in einer Zeit, die Sie brauchen. Kannst du einen Kommentar dazu abgeben, was im Vergleich zu deinem aktuellen Code verbessert werden muss (vorausgesetzt, du hast geschätzt, wie schnell du Bilder herunterladen kannst und deine aktuellen Code-Downloads langsamer als deine Ziele, aber verbesserungsfähig bis du die Netzwerkgrenzen erreichst). –

+0

Ich hätte hinzufügen sollen, dass die Geschwindigkeit von größter Bedeutung ist. – sanjosep43

+0

+1 Sehr interessante Frage. –

Antwort

6

Ich glaube, die zugrunde liegende Infrastruktur, die WebClient verwendet, wird bereits HTTP-Verbindungen Pool, so dass es nicht nötig ist, dies zu tun. Sie können überprüfen, ob Sie etwas wie Wireshark verwenden, natürlich mit einigen Beispiel-URLs.

Grundsätzlich würde ich den gleichen Ansatz wie bei anderen Programmieraufgaben verwenden - schreibe den Code auf die einfachste Weise, die funktioniert, und überprüfe dann, ob er für deine Bedürfnisse gut genug ist. Wenn es so ist, bist du fertig. Wenn dies nicht der Fall ist, verwenden Sie geeignete Tools (Netzwerkanalysatoren usw.), um herauszufinden, warum es funktioniert nicht gut genug, und verwenden Sie komplizierter Code nur, wenn es das Problem behebt.

Meine Erfahrung ist, dass WebClient ist in Ordnung, wenn es nicht das tut, was Sie brauchen - aber es gibt Ihnen nicht so viel feinkörnige Kontrolle wie WebRequest. Wenn Sie nicht diese Kontrolle benötigen, gehen Sie mit WebClient.

+0

Danke. Ich glaube nicht, dass der WebClient einen Pool benutzt hat. Ich muss das mit Drahthai überprüfen. Auch ich habe dein Buch gelesen, das sehr gut war! – sanjosep43

+0

@ user261490 Jon's Buch ist erstaunlich, aber dieser Kommentar ist nicht relevant für die Frage.Bitte versuchen Sie, Ihre Kommentare relevant für die Frage oder die Antwort, so dass es für andere hilfreich wäre –

+0

@ user261490 Jon ist richtig hier. Eine Sache zu betrachten ist in die [parallele Bibliotheken] (http://msdn.microsoft.com/en-us/library/dd460720.aspx) von MS in Kombination mit was auch immer Sie wählen. Dadurch können Sie mehrere Threads herunterladen, die natürlich durch die Bandbreite begrenzt sind. Stellen Sie sicher, dass Sie die Verbindungen schließen(), wenn Sie auch fertig sind ... Ich habe diesen Fehler einmal gemacht. – iMortalitySX

0

Ich benutze HttpWebRequest und HttpWebResponse, um alles kratzen, was ich will. Es sei denn natürlich gibt es Dienste für die Anforderung, aber manchmal gibt es Einschränkungen (Geschäftsbeschränkungen) und ich ziehe es oft vor, den HTML-Code aus der reinen http-Anfrage zu extrahieren. Manchmal fühlen Sie sich eher wie Entwickler, wissen Sie ...

+3

Sie haben keinen Grund angegeben * warum * Sie 'HttpWebRequest' /' HttpWebResponse' verwenden, was diese Antwort weniger nützlich macht, als es sonst sein könnte. –

Verwandte Themen