2011-08-27 20 views
7

Sto utilizzando webclient per eseguire il dowlnoad di un file. Sto calcolando la percentuale di avanzamento, come di seguitoCalcolo della percentuale di avanzamento

  1. So che la dimensione del file (l'ho letto dalla tabella del database) del file sta per essere scaricato.

  2. Sono in base alla proprietà BytesRecieved di WebClient per conoscere i byte totali recuperati durante il download.

  3. L'algoritmo che sto utilizzando è double dProgress = (e.BytesReceived/FileSize)*100); per calcolare la percentuale di avanzamento.

Tuttavia non sto ottenendo la percentuale di avanzamento corretta per aggiornare la barra di avanzamento.

Esiste un metodo per calcolare la percentuale di avanzamento?

+0

Che codice hai? –

+0

scusa, non ho capito quello che hai appena detto. – logeeks

+1

Come sai che è sbagliato? È sempre lo stesso? 0? NaN? > 100? Negativo? Qual è il problema esatto? – Cameron

risposta

17

Guardate la seguente riga: double dProgress = (e.BytesReceived/FileSize)*100)

Se entrambi e.BytesReceived e FileSize sono numeri interi, allora si avrà sempre 0 * 100 = 0.

fare qualcosa di simile:

double dProgress = ((double)e.BytesReceived/FileSize)*100.0

E 'a causa / la divisione intera quando divide due numeri interi. Ma tu non vuoi quello. Quindi converti una delle variabili in double.

+0

ho usato il tuo codice e ho scoperto che il codice sta generando correttamente. tuttavia la barra di avanzamento sta riempiendo solo un quarto. sto usando il minimo come 1 e il massimo come 100. il passo minimo come 0,1 e il massimo passo come 1.0.anche idee? – logeeks

1

BytesReceived e FileSize molto probabilmente sono numeri interi, quindi è necessario calcolare i progressi in questo modo:

double dProgress = 100.0 * e.BytesReceived/FileSize; 
1

Il problema è che entrambi i numeri sono interi. Quando li dividere, diventano più piccolo di 1, in modo da arrotondare fino a 0. loro Typecast per rendere il risultato un float:

double dProgress = ((double)e.BytesReceived/FileSize)*100) 
3

Se si sta gestendo l'evento DownloadProgressChanged quando si fa un download asincrono, i args evento ha già un ProgressPercentage su di esso, quindi non ha senso reinventarlo. Un esempio inventato:

var client = new WebClient(); 
var reset = new ManualResetEvent(false); 
client.DownloadProgressChanged += (s, e) => Console.WriteLine("{0} percent complete", e.ProgressPercentage); 
client.DownloadFileCompleted += (s, e) => reset.Set(); 
client.DownloadFileAsync(new Uri("http://myfilepathhere.com"), "file.name"); 
//Block till download completes 
reset.WaitOne(); 
+0

+ 1, grandi opere :) –

+0

sto ottenendo il e.Progresspercentage sempre come 0 quindi sto cercando metodi alternativi – logeeks

0

Prova questo:

WebClient Client = new WebClient(); 
Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 

...

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 

      double bytesIn = double.Parse(e.BytesReceived.ToString()); 
      double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
      double percentage = bytesIn/totalBytes * 100; 
      int percente = int.Parse(Math.Truncate(percentage).ToString()); 
      progressBar.Value = percente; 
     } 

O semplicemente utilizzando il valore ProgressPercentage.

void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) { 
      progressBar.Value = e.ProgressPercentage; 
    } 
+2

So che sono anno e mezzo in ritardo, ma devo rispondere a questo. È questo ** double.Parse (e.BytesReceived.ToString()) ** trolling o non sai cosa è il casting di tipo? – mnn

1

Questo è un problema molto complesso con l'aritmetica di base e il cast in C#.

Soluzione

Prima memorizzare il risultato della divisione intera in una doppia variabile. Quindi digita il cast in un numero intero.

int x = 5, y = 10, answer; 
double ansDouble; 
answer = (int)(x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/y) * 100; //percentage calculation 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=0 

answer = (int)((double)x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

answer = (int)(x/(double)y) * 100; //percentage calculation 
Console.WriteLine("x={0}", answer); 
//>output percentage=0 

ansDouble = ((double)x/y) * 100; 
answer = (int)ansDouble; 
Console.WriteLine("percentage={0}", answer); 
//>output percentage=50 

Punti da notare

scopre che x/y = 0, per tutti i valori di x ed y fintanto che sono interi Non può risolvere questo in una linea con qualsiasi combinazione di colata

Problemi correlati