2010-11-10 13 views

Respuesta

2

Lo siguiente se aplica al .NET Framework completo, ya que su pregunta está etiquetada como ASP.NET. (Las cosas pueden ser diferentes en Silverlight).

Respuesta breve: es complejo, el comportamiento depende de varias cosas, incluidas las características de rendimiento de la red, por lo que es incoherente y no puede controlarlo fácilmente.

Respuesta larga:

El evento normalmente se elevará cada vez que la secuencia subyacente proporcionada por el WebResponse invoca la devolución de llamada de finalización de la operación BeginRead que WebClient utiliza para realizar descargas asincrónicas.

Parece que WebClient generalmente intentará leer datos en trozos de 64k. Sin embargo, las transmisiones no necesitan devolver tantos datos como solicitó la llamada; es muy posible que una llamada al BeginRead que solicite 64k devuelva menos. De hecho, eso es bastante común para transmisiones que leen datos de la red; es probable que devuelvan una cantidad menor de datos poco después de estar disponibles, en lugar de esperar hasta que hayan ingresado los 64k.

Entonces, la respuesta exacta depende de la secuencia en cuestión, y también puede depender en cierta medida de la naturaleza y el rendimiento de la conexión de red.

WebClient utiliza WebRequest.Create para obtener la aplicación de solicitud/respuesta que finalmente suministrar la corriente, y eso es un mecanismo extensible - NET tiene 5 implementaciones incorporadas de WebRequest y ofrece un mecanismo de extensibilidad que le permite registrar manejadores adicionales. Y es la implementación específica WebRequest la que determina la naturaleza de la transmisión.

Por lo tanto, la frecuencia con la que obtiene eventos de progreso depende completamente del tipo de descarga que esté realizando; puede obtener resultados diferentes según el tipo de URL que sea. (Por ejemplo, http vs. ftp vs file, o lo que sea).

Voy a arriesgarme a adivinar que está usando HTTP.

Incluso entonces, es bastante complicado: el HttpWebResponse no siempre utiliza el mismo tipo de transmisión. Por ejemplo, a veces puede devolver una secuencia derivada de MemoryStream, a veces es del tipo ConnectStream ...

Por lo que no puede decir con certeza qué tamaño de trozos es probable que regrese la secuencia subyacente porque ni siquiera puede asegúrese de qué tipo de transmisión es probable que obtenga.

En cuanto a si puede controlarlo, de la única manera que podría ser proporcionar una implementación personalizada WebRequest para un esquema de URL personalizado. Pero, francamente, probablemente sea más simple escribir código que decida si hacer algo con un evento en particular o no, en lugar de intentar cambiar la frecuencia de los eventos.

0

Bueno, mis pruebas parecen sugerir que es en gran medida indeterminado.

El evento nunca parece tener un tamaño inferior a 828 bytes y parece que no supera los 65536 bytes.

No he podido encontrar detalles de MSDN. Su descripción:

"Este evento se produce cada vez que una descarga asincrónica avanza. Este evento se genera cuando las descargas se empezaron a utilizar cualquiera de los métodos siguientes “

Código utilizado de la siguiente manera:.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim client As New WebClient 

     AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompleted 
     AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressCallback 

     Dim uri As New Uri("http://ftp.iinet.net.au/test500MB.dat", UriKind.Absolute) 

     client.DownloadFileAsync(uri, "test500MB.dat") 
End Sub 

Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) 

     Debug.Print("{0} downloaded {1} of {2} bytes. {3} % complete... Difference: {4}", _ 
     CStr(e.UserState), e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage, CLng(e.BytesReceived - m_LastValue)) 

     m_LastValue = e.BytesReceived 
End Sub 

Salidas:

downloaded 27416820 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27482356 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27483184 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27548720 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27550960 of 500000000 bytes. 5 % complete... Difference: 2240 
    downloaded 27586260 of 500000000 bytes. 5 % complete... Difference: 35300 
    downloaded 27651796 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27652624 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27718160 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27718988 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27755700 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27821236 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27822064 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27887600 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27888428 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27925140 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27990676 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27991504 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28057040 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28057868 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28094580 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 28160116 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28160944 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28226480 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28227308 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28264020 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 28329556 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28330384 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28395920 of 500000000 bytes. 5 % complete... Difference: 65536 

archivo 10mb la salida Cambios a:

downloaded 307533 of 10000000 bytes. 3 % complete... Difference: 28240 
    downloaded 369661 of 10000000 bytes. 3 % complete... Difference: 62128 
    downloaded 431789 of 10000000 bytes. 4 % complete... Difference: 62128 
    downloaded 497325 of 10000000 bytes. 4 % complete... Difference: 65536 
    downloaded 498153 of 10000000 bytes. 4 % complete... Difference: 828 
    downloaded 553221 of 10000000 bytes. 5 % complete... Difference: 55068 
    downloaded 618757 of 10000000 bytes. 6 % complete... Difference: 65536 
    downloaded 619585 of 10000000 bytes. 6 % complete... Difference: 828 
    downloaded 649237 of 10000000 bytes. 6 % complete... Difference: 29652 
    downloaded 714773 of 10000000 bytes. 7 % complete... Difference: 65536 
    downloaded 715601 of 10000000 bytes. 7 % complete... Difference: 828 
    downloaded 748077 of 10000000 bytes. 7 % complete... Difference: 32476 
    downloaded 813613 of 10000000 bytes. 8 % complete... Difference: 65536 
    downloaded 814441 of 10000000 bytes. 8 % complete... Difference: 828 
    downloaded 866685 of 10000000 bytes. 8 % complete... Difference: 52244 
    downloaded 932221 of 10000000 bytes. 9 % complete... Difference: 65536 
    downloaded 933049 of 10000000 bytes. 9 % complete... Difference: 828 
    downloaded 982469 of 10000000 bytes. 9 % complete... Difference: 49420 
    downloaded 1048005 of 10000000 bytes. 10 % complete... Difference: 65536 
    downloaded 1048833 of 10000000 bytes. 10 % complete... Difference: 828 
    downloaded 1114369 of 10000000 bytes. 11 % complete... Difference: 65536 
    downloaded 1115197 of 10000000 bytes. 11 % complete... Difference: 828 
+0

PD: Acabo de notar que esta fue una pregunta C# ... No me maten por el código VB :-) –

Cuestiones relacionadas