2010-11-10 15 views

risposta

2

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.

0

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 
+0

PS: Ho appena notato che questa era una domanda in C# ... Non uccidermi per il codice VB :-) –

Problemi correlati