2012-06-03 5 views
6

Sto scrivendo un'applicazione che carica file di grandi dimensioni su un servizio Web utilizzando HttpWebRequest.Invio di file di grandi dimensioni con HttpWebRequest, buffer in aumento o in diminuzione in base alle esigenze

Questa applicazione verrà eseguita da varie persone con varie velocità di Internet.

Ho letto il file in modo asincrono e scrivo in modo asincrono questi blocchi sul flusso della richiesta. Lo faccio in un ciclo usando i callback. E continuo a farlo fino a quando non è stato inviato l'intero file.

La velocità del caricamento viene calcolata tra le scritture e la GUI viene successivamente aggiornata per mostrare la velocità.

Il problema che sto affrontando è decidere una dimensione del buffer. Se lo faccio troppo grande, gli utenti con connessioni lente non vedranno aggiornamenti frequenti della velocità. Se lo faccio troppo piccolo, gli utenti con connessioni veloci finiranno per "martellare" i metodi di lettura/scrittura che causano picchi di utilizzo della CPU.

Quello che sto facendo ora è avviare il buffer a 128kb, e poi ogni 10 scritture controllo la velocità media di scrittura di quelle 10 scritture, e se è in un secondo aumento la dimensione del buffer di 128kb. Riduco anche il buffer in modo simile se la velocità di scrittura scende sotto i 5 secondi.

Questo funziona abbastanza bene, ma sembra tutto molto arbitrario e sembra che ci sia margine di miglioramento. La mia domanda è, qualcuno ha affrontato una situazione simile e quale linea di condotta hai preso?

Grazie

+1

Questo sembra un approccio molto solido. E funziona anche. Non lo cambierei – zmbq

risposta

0

Penso che questo sia un buon approccio. Anch'io ho usato il caricamento di file di grandi dimensioni. Ma c'era un piccolo tweek in quello. Ho determinato la velocità di connessione nella prima richiesta effettuando una chiamata al mio servizio diverso. Questo in realtà salverebbe il sovraccarico di ricalcolare la velocità ad ogni richiesta. Il motivo principale per farlo era

  1. In connessione lenta, la velocità di solito oscilla molto. Quindi ricalcolarlo ogni richiesta non ha senso.

  2. Dovevo fornire il servizio di ripresa anche dove l'utente sarebbe in grado di ricaricare il file dal punto in cui si è conclusa l'ultima volta.

Considerando la scalabilità, ho utilizzato il buffer con la prima richiesta. Fammi sapere se ha aiutato

+0

Ho finito per farlo come ho detto e funziona molto bene. Non mi è mai piaciuta l'idea di decifrare la velocità nel modo in cui hai citato, perché potrebbe dare la lettura sbagliata se l'ospite si trovava in un altro paese o stava passando una giornata lenta. Comunque tu sollevi dei buoni punti. Accettata la tua risposta – NoPyGod