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