簡體   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