C# DownloadProgressChangedEventHandler多久调用一次
我正在使用Webclient异步下载文件。我想知道你多久来一次C# DownloadProgressChangedEventHandler多久调用一次,c#,.net,asp.net,C#,.net,Asp.net,我正在使用Webclient异步下载文件。我想知道你多久来一次 下载ProgressChangedEventHandler是否接到电话?用户可以控制它吗?以下内容适用于完整的.NET Framework,因为您的问题被标记为ASP.NET。(在Silverlight中情况可能会有所不同。) 简短回答:这很复杂,行为取决于各种因素,包括网络性能特征,因此不一致,您无法轻松控制 长答覆: 每次WebResponse提供的底层流调用BeginRead操作的完成回调时,通常会引发该事件,而WebClie
下载ProgressChangedEventHandler是否接到电话?用户可以控制它吗?以下内容适用于完整的.NET Framework,因为您的问题被标记为ASP.NET。(在Silverlight中情况可能会有所不同。) 简短回答:这很复杂,行为取决于各种因素,包括网络性能特征,因此不一致,您无法轻松控制 长答覆: 每次
WebResponse
提供的底层流调用BeginRead
操作的完成回调时,通常会引发该事件,而WebClient
使用该操作执行异步下载
看起来WebClient
通常会尝试读取64k块中的数据。但是,流不需要返回被调用请求的数据量-完全有可能对请求64k的BeginRead
的调用返回的数据量会更少。事实上,对于从网络读取数据的流来说,这是很常见的——它们可能在数据可用后不久返回较少的数据量,而不是等到所有64k数据都进来
因此,确切的答案取决于所讨论的流,也可能在某种程度上取决于网络连接的性质和性能
WebClient
使用WebRequest.Create
来获得最终提供流的请求/响应实现,这是一种可扩展机制-.NET有5个WebRequest
的内置实现,它提供了一种可扩展机制,允许您注册其他处理程序。具体的WebRequest
实现决定了流的性质
因此,您获取进度事件的频率完全取决于您正在进行的下载类型-您可以根据URL的类型获得不同的结果。(例如,http与ftp与文件,或其他任何形式。)
我将冒昧地猜测您正在使用HTTP
即使这样,它也相当复杂,HttpWebResponse
并不总是使用相同类型的流。例如,它有时可以返回从MemoryStream
派生的流,有时它的类型是ConnectStream
因此,您无法确定底层流可能返回的数据块大小,因为您甚至无法确定可能得到的数据流类型
至于您是否可以控制它,唯一的方法是为自定义URL方案提供自定义
WebRequest
实现。但是坦率地说,只编写决定是否对任何特定事件执行任何操作的代码可能比尝试更改事件频率更简单。我的测试似乎表明,这在很大程度上是不确定的
该事件似乎从不少于828字节,也不超过65536字节
我无法从MSDN中找到任何细节。他们的描述:
“每次发生错误时都会引发此事件
异步下载取得了进展。
下载时引发此事件
使用以下任何一项启动
方法。”
使用的代码如下:
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
产出:
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
10mb文件输出更改为:
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
PS:刚刚注意到这是一个C#问题。。。不要因为VB代码杀了我:-)