2011-02-12 18 views
6

Estoy intentando descargar un archivo de Internet con C# utilizando el método DownloadDataAsync de un objeto WebClient.C# WebClient DownloadProgressChanged no funcionará correctamente

También deseo obtener el progreso de la descarga mediante el uso del evento DownloadProgressChanged del objeto webclient.

El problema es que ni las propiedades BytesReceived ni TotalBytesToReceive muestran los valores correctos. Ambos están cambiando de manera irreproducible cuando trato de verificarlos mientras se depura.

Mi código:

WebClient client = new WebClient(); 
     client.BaseAddress = this.DownloadUrl; 
     client.DownloadProgressChanged += downloadProgressDelegate; 
     client.DownloadDataAsync(new System.Uri(this.DownloadUrl)); 
+1

¿Qué archivo está descargando? ¿Puedes probar un archivo grande de tu IIS local con el ancho de banda limitado para ofrecer un entorno de prueba reproducible? –

Respuesta

5

que acaba de intentar el siguiente código en LINQPad:

var uri = @"http://download.services.openoffice.org/files/stable/3.3.0/OOo_3.3.0_Win_x86_install-wJRE_en-US.exe"; 

WebClient client = new WebClient(); 
client.DownloadProgressChanged += (sender, e) => 
    { 
    Console.WriteLine("Bytes: " + e.BytesReceived + " of " + e.TotalBytesToReceive); 
    }; 

client.DownloadDataAsync(new System.Uri(uri)); 

Thread.Sleep(4000); 
client.CancelAsync(); 

... y consiguió el siguiente resultado:

 
Bytes: 4138 of 158067944 
Bytes: 50858 of 158067944 
Bytes: 68378 of 158067944 
Bytes: 134078 of 158067944 
Bytes: 133914 of 158067944 
..... 

parece funcionar.

EDIT: Tal vez su servidor HTTP no hace return the size correctamente, pero no tienen un URI para probar este comportamiento del servidor en contra de la aplicación WebClient.

+0

¿Podría depender del archivo que está descargando? –

1

tenido problemas similares, justo después de DownloadDataAsync intento:

while (client.IsBusy) { Application.DoEvents(); } 
0

Usted simplemente debe "esperar" la misma. Es decir .:

await client.DownloadDataAsync(new System.Uri(uri)); 

Por favor, no se olvide de convertir su método en una "tarea asíncrona", asíncrono de tareas o nula asíncrono. De lo contrario, si usted no quiere hacer cambios en su signiture método también se puede hacer lo siguiente:

client.DownloadDataAsync(new System.Uri(uri)).Wait(); 

Tanto los enfoques anteriores tienen ventajas y desventajas, y le toca a usted para tomar los cuales uno de ellos.

Cuestiones relacionadas