Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何提高从网站下载文件的速度?_C#_.net_Web_Download - Fatal编程技术网

C# 如何提高从网站下载文件的速度?

C# 如何提高从网站下载文件的速度?,c#,.net,web,download,C#,.net,Web,Download,我有一个C#控制台应用程序,可以从网站下载文件。以下是我的方法: public bool DownloadFile(string fileUri, string filePath) { using (var response = _GetResponce(fileUri)) { if (response.StatusCode != HttpStatusCode.OK) { return false; } using

我有一个C#控制台应用程序,可以从网站下载文件。以下是我的方法:

public bool DownloadFile(string fileUri, string filePath)
{
    using (var response = _GetResponce(fileUri)) {
        if (response.StatusCode != HttpStatusCode.OK) {
            return false;
        } 
        using (var responseStrm = response.GetResponseStream()) {
            using (var fileStrm = new FileStream(filePath, FileMode.OpenOrCreate)) {
            var buffer = new byte[CommonConstants.StreamBufferSize];
            int bytesRead = responseStrm.Read(buffer, 0, CommonConstants.StreamBufferSize);      
            while(bytesRead > 0) {
                fileStrm.Write(buffer, 0, bytesRead);
                bytesRead = responseStrm.Read(buffer, 0, CommonConstants.StreamBufferSize);
            }
        }
    }
}

private HttpWebResponse _GetResponce(string requestedUri, string method = "GET")
{
    var request = (HttpWebRequest)WebRequest.Create(requestedUri);
    request.Method = method;
    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    request.Headers[HttpRequestHeader.AcceptLanguage] = "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3";
    request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate";
    request.Headers[HttpRequestHeader.AcceptCharset] = "windows-1251,utf-8;q=0.7,*;q=0.7";
    return (HttpWebResponse)request.GetResponse();
}

我试图增加缓冲区大小,但没有效果。如果我添加线程,它能提高下载速度吗?

根据服务器的不同,下载包含多个段的文件可能会获得一定的速度

为此,您可以使用不同的线程下载同一个文件。请注意,将数据写入本地文件时,必须以正确的偏移量开始

这是大多数下载管理器都会做的事情


请注意,某些服务器不允许这样做。

在将数据写入文件之前,您是否尝试过缓冲更多数据?一般来说,您希望尽快轮询套接字——根据我的经验,即使有许多字节可供读取,也只能返回其中相对较小的一部分,这意味着套接字吞吐量最终与循环其余部分的开销挂钩,这可能非常重要

尝试以下代码,看看您是否获得了可衡量的改进:

using (var fileStrm = new FileStream(filePath, FileMode.OpenOrCreate))
using (var responseStrm = response.GetResponseStream()) {
    const int BufferSize = 1 * 1024 * 1024 + CommonConstants.StreamBufferSize;
    var buffer = new byte[BufferSize];
    int offset, bytesRead;
    do {    // Until we've read everything
        offset = 0;
        do {        // Until the buffer is very nearly full or there's nothing left to read
            bytesRead = responseStrm.Read(buffer, offset, BufferSize - offset);
            offset += bytesRead;
        } while (bytesRead != 0 && offset + CommonConstants.StreamBufferSize < BufferSize);

        // Empty the buffer
        if (offset != 0) {
            fileStrm.Write(buffer, 0, offset);
        }
    } while (bytesRead != 0);
}

你确定瓶颈在这段代码中,而不是在某个地方的网络中吗?@Alexander你在不同网络上的多台机器上运行过这段代码吗?如果不是,他们可能都只是经历了Rup提到的相同瓶颈。@Alexander,这不是问题所在。不同的机器在不同的网络上吗?如果你在同一网络上的不同机器上尝试,它们都会很慢(因为它们连接到同一网络)此外,你应该真正考虑使用<代码> WebClient <代码>,如果你只是简单的下载,它是一个线性:<代码> String data =新WebCclipse()。DownloadString(“http://”);代码>。不需要乱搞缓冲区和流之类的东西。是的,我试过了。浏览器下载文件的速度总是比我的应用程序快。不幸的是,增加缓冲区大小并不能help@Alexander字体啊,好吧,值得一试(我过去见过它起作用)。你试过上面的代码吗?Cameron谢谢你的帮助:我试过你的代码,下载速度根据文件大小提高了5-10%。这还不错,但对我来说还不够。@Alexander:噢,太棒了!可能值得玩转缓冲区大小(可能更大?),或者在后台线程中写入文件。Bruno,我尝试过你的解决方案,它对我很有帮助。非常感谢你。
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;