繁体   English   中英

使用WebClient下载文件时覆盖传输速率限制

[英]Overriding transfer rate limit while using WebClient to download files

我正在使用WebClient.DownloadFileTaskAsync()同时从网站下载文件。 对于每个文件,前x个字节数以我的连接的最大速度下载,但随后速度降到令人痛苦的32kbps,导致大于几兆字节的数据要花很长时间才能完成。 如果要下载1个文件或50个文件,这没有什么区别。

有什么办法可以解决这个问题,并且下载整个文件而不会减慢速度?

using (WebClient wc = new WebClient())
{
    wc.Proxy = null;
    wc.DownloadProgressChanged += (s, e) => 
        Application.Current.Dispatcher.BeginInvoke((Action)(() =>
        {
            track.Progress = e.ProgressPercentage;
            track.TotalBytes = e.TotalBytesToReceive;
            track.BytesReceived = e.BytesReceived;
        }));

    await wc.DownloadFileTaskAsync(
        new Uri(track.FilePath), 
        string.Format(
            "{0}/{1} {2}.mp3",
            directory,
            track.Number,
            track.TitlePath));
}

更新:将文件加载到浏览器中时,它们表现出相同的行为,因此,似乎该问题不是我的应用程序本地的。 如果有人对造成此问题的原因有任何想法,请告诉我。


更新:这似乎与我正在使用的网站有关。 从其他网站下载的速度非常快,我尝试在连接到VPN时运行该程序,但结果相同。 WebClient的所有数据获取方法的行为都相同,包括OpenRead。 我可以尝试使用任何技巧来防止速度下降吗?

有趣的是,异步操作上的事件通常会自动封送回调用该操作的同一线程。 所以,如果你调用DownloadFileTaskAsync主界面线程(或调度程序线程,这取决于你的观点),那么在DownloadProgressChanged将主界面线程上被调用,你不需要使用BeginInvoke

我认为这不是您的问题,但是WebClient要做的一件事是使用线程池线程来帮助调用事件。 不幸的是,这通常会给线程池造成压力,最终导致下载出现节流问题。

如果下载过程中的吞吐量并不十分重要,建议您改用HttpClient

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM