[英]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.