C# DownloadProgressChangedEventHandler多久调用一次

C# DownloadProgressChangedEventHandler多久调用一次,c#,.net,asp.net,C#,.net,Asp.net,我正在使用Webclient异步下载文件。我想知道你多久来一次 下载ProgressChangedEventHandler是否接到电话?用户可以控制它吗?以下内容适用于完整的.NET Framework,因为您的问题被标记为ASP.NET。(在Silverlight中情况可能会有所不同。) 简短回答:这很复杂,行为取决于各种因素,包括网络性能特征,因此不一致,您无法轻松控制 长答覆: 每次WebResponse提供的底层流调用BeginRead操作的完成回调时,通常会引发该事件,而WebClie

我正在使用Webclient异步下载文件。我想知道你多久来一次
下载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代码杀了我:-)