当前位置:  开发笔记 > 编程语言 > 正文

C#下载网页.需要更好的方法,CPU使用率高

如何解决《C#下载网页.需要更好的方法,CPU使用率高》经验,为你挑选了1个好方法。

我试图让这段代码更好一点.我怀疑它是一次读取一个字节的循环.我无法通过gzip解压缩找到另一种方法.实现a StreamReader很好,但它返回一个我无法传递给解压缩流的字符串.

有没有更好的办法?

byte[] bufffer = null;
List resourceBytes = new List();
int byteValue = 0;
WebResource resource = new WebResource();
HttpWebResponse webResponse = null;

try {
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(resourceUri);
    webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
    webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    webRequest.UserAgent = agent;
    webRequest.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
    webRequest.Credentials = CredentialCache.DefaultCredentials;
    webRequest.Referer = resourceUri.OriginalString;
    webRequest.Timeout = 5000;

    webResponse = (HttpWebResponse)webRequest.GetResponse();

    Stream webStream = webResponse.GetResponseStream();

    if (!string.IsNullOrEmpty(webResponse.ContentEncoding)) {
        if (webResponse.ContentEncoding.ToLower().Contains("gzip")) {
            webStream = new GZipStream(webStream, CompressionMode.Decompress);
        }
        else if (webResponse.ContentEncoding.ToLower().Contains("deflate")) {
            webStream = new DeflateStream(webStream, CompressionMode.Decompress);
        }
    }

    do {
        byteValue = webStream.ReadByte();

        if (byteValue != -1) {
            resourceBytes.Add((byte)byteValue);
        }

    } while (byteValue != -1);


    //Free up resources
    webStream.Close();
    webResponse.Close();

    bufffer = resourceBytes.ToArray();

Marc Gravell.. 9

我同意jmcd,WebClient会更简单,特别是WebClient.DownloadData.

实际的问题,问题是你正在读单个字节,当你应该有一个固定的缓冲区,并循环 - 即

int bytesRead;
byte[] buffer = new byte[1024];
while((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0) {
  // process "bytesRead" worth of data from "buffer"
}

[编辑增加重点]重要的一点是你每次处理"bytesRead"值的数据; 除此之外的一切都是垃圾.



1> Marc Gravell..:

我同意jmcd,WebClient会更简单,特别是WebClient.DownloadData.

实际的问题,问题是你正在读单个字节,当你应该有一个固定的缓冲区,并循环 - 即

int bytesRead;
byte[] buffer = new byte[1024];
while((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0) {
  // process "bytesRead" worth of data from "buffer"
}

[编辑增加重点]重要的一点是你每次处理"bytesRead"值的数据; 除此之外的一切都是垃圾.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有