Sto utilizzando Webclient per scaricare un file in modo asincrono. Mi chiedo quanto spesso viene chiamato DownloadProgressChangedEventHandler? L'utente può controllarlo?Quante volte verrà chiamato DownloadProgressChangedEventHandler
risposta
Quanto segue vale per la versione completa di .NET Framework, dal momento che la tua domanda è contrassegnati ASP.NET. (Le cose potrebbero essere diverse in Silverlight.)
Risposta breve: è complesso, il comportamento dipende da varie cose tra cui le caratteristiche delle prestazioni di rete, quindi è incoerente e non è possibile controllarlo facilmente.
Risposta lunga:
L'evento sarà tipicamente essere sollevato ogni volta che il flusso sottostante fornito dal WebResponse
richiama il callback completamento dell'operazione BeginRead
che WebClient
utilizza per eseguire download asincroni.
Sembra WebClient
tipicamente tenterà di leggere i dati in blocchi di 64 KB. Tuttavia, gli stream non sono obbligati a restituire più dati richiesti dall'operatore chiamato - è del tutto possibile che una chiamata a BeginRead
che richiede 64k restituisca meno. In effetti, è abbastanza comune per i flussi che leggono i dati dalla rete, è probabile che restituiscano una quantità minore di dati poco dopo essere disponibili, piuttosto che attendere che tutti i 64k siano entrati.
Quindi la risposta esatta dipende il flusso in questione e può anche dipendere in una certa misura dalla natura e dalle prestazioni della connessione di rete.
WebClient
utilizza WebRequest.Create
per ottenere l'attuazione di richiesta/risposta che alla fine fornire il flusso, e questo è un meccanismo estendibile - NET ha 5 implementazioni incorporate di WebRequest
e offre un meccanismo di estensibilità che permette di registrare i gestori supplementari. Ed è l'implementazione specifica WebRequest
che determina la natura del flusso.
Quindi la frequenza con cui si ottengono gli eventi di avanzamento dipende interamente dal tipo di download che si sta eseguendo - è possibile ottenere risultati diversi a seconda del tipo di URL che è. (Ad esempio, http ftp vs vs di file, o qualsiasi altra cosa.)
ho intenzione di tentare di indovinare selvaggia che si sta utilizzando HTTP.
Anche allora, è piuttosto complicato - l'HttpWebResponse
non usa sempre lo stesso tipo di flusso. Per esempio, a volte può restituire un flusso derivato da MemoryStream
, a volte è di tipo ConnectStream
...
Quindi non si può dire con certezza che cosa pezzi dimensione del flusso sottostante è probabile che torni, perché non si può nemmeno Assicurati di quale tipo di stream hai probabilità di ottenere.
Per quanto riguarda il fatto che sia possibile controllarlo, l'unico modo che si potrebbe fare è fornire un'implementazione personalizzata WebRequest
per uno schema URL personalizzato. Ma francamente, è probabilmente più semplice scrivere codice che decida se fare o meno qualcosa con un particolare evento piuttosto che provare a cambiare la frequenza degli eventi.
Beh mie prove sembrano suggerire che è in gran parte indeterminata.
L'evento sembra non generare mai meno di 828 byte e sembra non più di 65536 byte.
Non riesco a trovare dettagli specifici da MSDN. La loro descrizione:
"Questo evento viene generato ogni volta che un download asincrono procede. Questo evento viene generato quando download vengono avviati utilizzando uno dei seguenti metodi “
codice utilizzato come segue:.
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
Uscite:
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
file da 10 MB l'uscita diventa:
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. quante volte verrà chiamato strlen() in questo ciclo for?
- 2. Quante volte verrà eseguito questo ciclo?
- 3. Compilazione del compilatore - quante volte?
- 4. didRegisterForRemoteNotificationsWithDeviceToken ha chiamato due volte?
- 5. Quante volte dovrei salvare in Core Data?
- 6. Controlla quante volte valore specifico nell'array PHP
- 7. keyboardWillShow chiamato due volte
- 8. didMoveToParentViewController chiamato due volte
- 9. textFieldShouldEndEditing chiamato più volte
- 10. onPerformSync() chiamato più volte
- 11. miglior modo per contare quante volte al secondo il metodo viene chiamato
- 12. Quando verrà chiamato InstanceIDListenerService e come testarlo?
- 13. React Native - Quando verrà chiamato "componentWillUnmount"?
- 14. Android - onStop() verrà chiamato con un ritardo
- 15. metodo awakeFromNib chiamato più volte
- 16. jquery callbacks chiamato più volte
- 17. frammento suCreateView chiamato più volte
- 18. applicationDidBecomeActive chiamato per due volte
- 19. NSURLProtocol canInitWithRequest: chiamato più volte
- 20. Il costruttore della classe base verrà chiamato automaticamente?
- 21. Quando più chiamate alla stessa UDF sono in una singola istruzione, quante volte sarà chiamata?
- 22. Quante volte è stato eseguito il programma? C#
- 23. C# Best practice: contare quante volte ciascuna data si verifica
- 24. SQL conta quante volte un valore appare in più colonne?
- 25. contare quante volte ogni riga è presente in numpy.array
- 26. Quante volte dovrei usare try e catch in C#?
- 27. Javascript: quante volte un carattere si verifica in una stringa
- 28. Quante volte si deve compattare un database SQL CE?
- 29. la parola chiave var in coldfusion e quante volte l'uso
- 30. java: quante volte è l'espressione collezione valutata in un "foreach"
PS: Ho appena notato che questa era una domanda in C# ... Non uccidermi per il codice VB :-) –