2012-09-26 17 views
5

Problema: devo scaricare centinaia di immagini da diversi host. Ogni host ha ovunque tra 20 e centinaia di immagini.WebClient è il modo migliore per scaricare i dati http?

Soluzione: utilizzo di new WebClient ogni volta che è necessario scaricare un'immagine tramite il metodo del client WebClient.

O sarebbe meglio mantenere un pool di connessioni socket aperte e effettuare la richiesta http utilizzando chiamate di livello inferiore?

È costoso aprire/chiudere una connessione TCP (presumo che sia ciò che fa WebClient), quindi l'utilizzo di un pool sembra più efficiente?

+0

Il codice migliore è il codice che consente di ottenere i risultati di cui hai bisogno senza errori in un momento che ti serve. Così puoi commentare ciò che deve essere migliorato rispetto al tuo codice attuale (supponendo che tu abbia fatto delle stime sulla velocità con cui puoi scaricare le immagini e il tuo codice corrente più lento dei tuoi obiettivi ma avere un margine di miglioramento finché non raggiungi i limiti della rete). –

+0

Avrei dovuto aggiungere che la velocità è della massima preoccupazione. – sanjosep43

+0

+1 Domanda molto interessante. –

risposta

6

Credo che l'infrastruttura sottostante utilizzata da WebClient possa già condividere le connessioni HTTP, quindi non è necessario. Si consiglia di verificare utilizzando qualcosa come Wireshark, ovviamente, con alcuni URL di esempio.

Fondamentalmente, mi piacerebbe prendere lo stesso approccio a questa come con altre attività di programmazione - scrivere il codice nel modo più semplice che funziona, e quindi verificare se si comporta abbastanza bene per le vostre esigenze. Se lo fa, hai finito. In caso contrario, utilizzare gli strumenti appropriati (analizzatori di rete, ecc.) Per risolvere perché lo non sta funzionando abbastanza bene e utilizzare un codice più complicato solo se risolve il problema.

La mia esperienza è che WebClient va bene se non è quello che ti serve, ma non ti dà un controllo altrettanto preciso come WebRequest. Se non si dispone dicontrollo, andare con WebClient.

+0

Grazie. Non pensavo che WebClient avrebbe usato un pool. Dovrò verificarlo con wireshark. Inoltre ho letto il tuo libro che è stato molto buono! – sanjosep43

+0

@ user261490 Il libro di Jon è fantastico, ma questo commento non è pertinente alla domanda. Cerca di rendere i tuoi commenti pertinenti alla domanda o alla risposta in modo che possa essere utile per gli altri –

+0

@ user261490 Jon è proprio qui. Una cosa da considerare è la ricerca nelle [librerie parallele] (http://msdn.microsoft.com/en-us/library/dd460720.aspx) da MS in combinazione con qualsiasi cosa tu scelga. Questo ti permetterà di scaricare su più thread, limitati ovviamente dalla larghezza di banda. Assicurati di chiudere() le connessioni anche quando hai finito ... Ho fatto quell'errore una volta. – iMortalitySX

0

Io uso HttpWebRequest e HttpWebResponse per racimolare tutto ciò che voglio. A meno che, naturalmente, non ci siano servizi disponibili per il requisito, ma anche se, a volte, esistono limitazioni (limitazioni aziendali) e spesso preferisco scavare l'html dalla pura richiesta http. A volte ti senti più simile a uno sviluppatore, lo sai ...

+3

Non hai specificato alcun motivo * perché * usi 'HttpWebRequest' /' HttpWebResponse', il che rende questa risposta meno utile di quanto potrebbe altrimenti. –

Problemi correlati