Estoy utilizando Webclient para descargar un archivo de forma asincrónica. Me pregunto ¿con qué frecuencia se llamará a DownloadProgressChangedEventHandler? ¿Puede el usuario controlarlo?Con qué frecuencia se llamará DownloadProgressChangedEventHandler
Respuesta
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.
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
- 1. ¿qué constructor se llamará para ver?
- 2. ¿Con qué frecuencia se llama a viewDidLoad?
- 3. ¿Con qué frecuencia se lanza xhr.upload.onProgress?
- 4. ¿Con qué frecuencia se ejecuta el GC?
- 5. Html Select List: ¿por qué onchange se llamará dos veces?
- 6. ¿Qué tan pronto se llamará a jQuery (documento)?
- 7. ¿Con qué frecuencia Python se vacia a un archivo?
- 8. ¿Con qué frecuencia se deberían hacer las revisiones del código?
- 9. ¿Con qué frecuencia se ejecutan los inicializadores en Rails?
- 10. ¿Por qué Java se usa con frecuencia para aplicaciones empresariales?
- 11. ¿Con qué frecuencia se comprueba la retroalimentación de APNS?
- 12. ¿Por qué viewDidUnload se llama con menos frecuencia que viewDidLoad?
- 13. ¿Con qué frecuencia implementa los tres grandes?
- 14. ¿Con qué frecuencia debería crear un EntityManager?
- 15. Descartar UIPopoverController con -dismissPopoverAnimated: no se llamará delegate?
- 16. ¿Con qué frecuencia deberíamos escribir pruebas unitarias?
- 17. ¿Cuándo __destruct no se llamará en PHP?
- 18. ¿Con qué frecuencia encuentra javascript deshabilitado en los navegadores?
- 19. ¿Con qué frecuencia usa pseudocódigo en el mundo real?
- 20. ¿Con qué frecuencia debo guardar en Core Data?
- 21. Apple Push Notification Feedback Service - con qué frecuencia marca
- 22. ¿Cuántas veces se llamará a strlen() en este ciclo for?
- 23. ¿Por qué no se llamará el interceptor de DynamicProxy para * cada * llamada al método virtual?
- 24. ¿Con qué frecuencia debo usar try and catch in C#?
- 25. SQL Server 2005 - ¿Con qué frecuencia debe reconstruir los índices?
- 26. ¿Con qué frecuencia deberíamos reciclar el grupo de aplicaciones?
- 27. ¿Con qué frecuencia google analytics actualiza los datos de tráfico?
- 28. ¿Con qué frecuencia crea conversiones implícitas para sus clases?
- 29. ¿Con qué frecuencia declaras que tus funciones son const?
- 30. analizar la tabla, optimizar la tabla, ¿con qué frecuencia?
PD: Acabo de notar que esta fue una pregunta C# ... No me maten por el código VB :-) –