2012-08-15 4 views
2

이 내 코드는 지금 :웹 사이트에서 콘텐츠를 다운로드하는 더 빠른 방법이 있습니까?

private string downloadContent() 
     { 
      try 
      { 
       WebRequest request = WebRequest.Create(url); 
       request.Method = "GET"; 
       response = request.GetResponse(); 
       Stream stream = response.GetResponseStream(); 
       reader = new StreamReader(stream); 
       string content = reader.ReadToEnd(); 
       return content; 
      } 
      catch 
      { 
       return error; 
      } 
     } 

이 사이트입니다 : 나는 채팅에 뭔가를 쓰고 있어요 때마다 n 초는 나를 표시됩니다 않았다 그래서

http://chatroll.com/testings 

무엇 내 프로그램 textBox1에 썼다 또한 내 하드 디스크에 텍스트 파일 로거에 써주세요.

문제는 가끔 채팅 (예 : 안녕하세요 (입력), 안녕하세요 (입력), 다니엘 (입력))에서 매우 빠르게 뭔가를 입력하면 가끔 내 프로그램에 표시되지 않습니다. 나는 타이핑하는 내용이 충분히 빨리 읽히지 않는다고 생각한다.

페이지 소스를 다운로드하고 처리하는 더 빠른 방법이 있습니까? 아마 내가 다운로드하는 방식이 그렇게 빠르지 않을까?

https://skydrive.live.com/redir?resid=3B8A7D9F66FF985B!171&authkey=!AFO6EmoF38MtkKQ

+0

질문에 설명 된 문제 외에도 일부 리소스 누출이 있습니다. 이 메소드의 모든 IDisposable 객체들, 특히'Stream'과'StreamReader' 객체에서'using' 문을 사용하는 것을 고려하십시오. –

+0

화면 스크래핑 대신 API를 사용하지 않는 이유는 무엇입니까? 그래서 당기기 대신 밀어 넣기를 할 수 있습니까? –

+0

Erno가 API 대신 코드에서 화면 스크래핑을 사용하는 방법을 보여 주시겠습니까? 나는 이것에 전에 생각했다 그러나 진짜로 그것을하는 방법을 결코 찾아 내지 않으며 그래서 나는 지금 그것을하는이 방법을 시도했다. –

답변

6

왜 더 높은 수준의 웹 클라이언트를 사용하지 :

현재 내 프로젝트 볼 수 있습니까? 나는 그것이 더 빠르다는 것을 모르지만 최소한 오류가 발생하기 쉽다. 리소스 (소켓 등)를 해제하려면 using 문에주의해야합니다.

using (var downloader = new WebClient()) 
{ 
    string result = downloader.DownloadString(url); 
} 

편집에 대한 성능 :

downloader.Headers["Accept-Encoding"] = "gzip"; 
:

  1. header 설정 : 웹 서버는 GZIP으로 압축을 지원하는 경우, 그 사용을 할 수 있습니다

  2. WebClient.DownloadData을 사용하여 압축 된 응답을에로드합니다.. 이 GZipStream


또 다른 편집을 사용하여

  • 압축 해제는 : 당신의 BackgroundWorker.DoWork 끔찍한 같습니다 당신이 등 중복 코드의 많은 불필요한 루프의 힙, 내가 강하게 당신이 열어 제안을 Code Review에 질문하고 그 방법을 게시하십시오. 그건 그렇고, 반복 코드마다 다운로드 코드 을 두 번 번이라고 부릅니다.

  • +0

    +1, 바퀴를 재발 명하지 마십시오. – Mizipzor

    +3

    이것은 주석이어야합니다. 그것은 실제로 그의 질문에 답하지 않습니다 (실제로 더 빠르지 않는 한). – Daniel

    +0

    @codeparkle 귀중한 것은 아니라고 말하지 않았지만, 중요한 것은 대답이 더 중요한 문제이고, 자신의 질문에 직접 답하는 것이 아니기 때문에 주석에 더 적합하다는 것입니다. 그러나 신고 할 필요가 없습니다. 귀중한 조언이며 IMO의 올바른 형식이 아닙니다. – Daniel

    1

    불과 몇 생각

    1 세트 request.Proxy를 null로. 일부 속도 향상에 도움이 될 수 있습니다. 함수에서

    2- Conditions 사용 HttpUtility.HtmlDecode 대신 캐릭터 동작

    3- (GetProfileNames 또는 GetTextFromProfile처럼) HTML을 파싱 문자열 연산을 사용하지 않는다. 대신 HtmlAgilityPack을 사용하십시오.예를 들면 다음과 같습니다.

    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
    doc.LoadHtml(page); 
    var text = doc.DocumentNode.Descendants("img") 
        .Where(x => x.Attributes["class"].Value="????????") 
        .Select(x=>x.InnerText) 
        .ToArray(); 
    
    관련 문제