我正在使用Webclient异步下载文件.我想知道DownloadProgressChangedEventHandler多久被调用一次?用户可以控制它吗?
以下内容适用于完整的 .NET Framework,因为您的问题被标记为 ASP.NET。(Silverlight 中的情况可能有所不同。)
简短的回答:它很复杂,行为取决于包括网络性能特征在内的各种因素,因此它不一致并且您无法轻松控制它。
长答案:
通常,每次由提供的底层流调用用于执行异步下载的操作的WebResponse完成回调时,都会引发该事件。BeginReadWebClient
看起来WebClient通常会尝试以 64k 块的形式读取数据。然而,流不需要返回与被调用者所要求的一样多的数据——完全有可能调用BeginRead该请求 64k 将返回更少的数据。事实上,这对于从网络读取数据的流来说很常见 - 它们可能会在数据可用后不久返回少量数据,而不是等到所有 64k 数据都传入。
因此,确切的答案取决于所讨论的流,并且在某种程度上还可能取决于网络连接的性质和性能。
WebClient用于WebRequest.Create获取最终提供流的请求/响应实现,这是一种可扩展机制 - .NET 有 5 个内置实现WebRequest,它提供了一种可扩展性机制,可让您注册其他处理程序。而具体的WebRequest实现决定了流的性质。
因此,您获取进度事件的频率完全取决于您正在执行的下载类型 - 根据 URL 的类型,您可以获得不同的结果。(例如,http、ftp、文件,或其他。)
我大胆猜测您正在使用 HTTP。
即使这样,它也相当复杂——HttpWebResponse并不总是使用相同类型的流。例如,它有时可以返回派生自 的流MemoryStream,有时它的类型为ConnectStream...
因此,您无法确定底层流可能返回的块大小,因为您甚至无法确定可能获得什么类型的流。
至于您是否可以控制它,唯一的方法就是WebRequest为自定义 URL 方案提供自定义实现。但坦率地说,编写代码来决定是否对任何特定事件执行任何操作,而不是尝试更改事件的频率可能更简单。