2012-08-15 39 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; 
      } 
     } 

這是網站:

http://chatroll.com/testings 

我這樣做,當我在聊天那裏寫的東西讓每n秒它會告訴我什麼我在我的程序textBox1中寫入,並將其寫入我的硬盤上的文本文件記錄器中。

問題是,有時如果我在聊天中輸入非常快的東西(例如:hello(輸入),Hi(輸入),Daniel(輸入)),Hi將不會顯示在我的程序中。我不認爲我輸入的內容正在被快速讀取。

有沒有更快的方式來下載頁面源代碼並處理它?也許我下載它的方式不是那麼快?

你可以看到我的項目在這裏:

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

+0

除了您在問題中列出的問題之外,您還有一些資源泄漏正在進行。考慮在該方法中的所有'IDisposable'對象上使用'using'語句,最顯着的是'Stream'和'StreamReader'對象。 – 2012-08-15 12:54:07

+0

爲什麼不使用API​​而不是屏幕抓取?所以你可以做推動而不是拉動? – 2012-08-15 12:54:54

+0

Erno你能不能展示我的代碼如何在我的代碼中使用屏幕抓取?我之前想過但從來沒有發現如何做到這一點,所以我現在就試着這樣做。 – 2012-08-15 12:56:35

回答

6

爲什麼不使用更高級的Web客戶端?我不知道它是否更快,但至少它不太容易出錯。你需要注意using聲明來釋放任何資源(套接字等)。

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

編輯有關業績:如果Web服務器支持壓縮,如GZIP,你可能想利用是:

  1. 設置header

    downloader.Headers["Accept-Encoding"] = "gzip"; 
    
  2. 使用WebClient.DownloadData將壓縮響應加載到byte[]。使用GZipStream


另一個編輯

  • 解壓:你BackgroundWorker.DoWork看起來可怕:你有很多冗餘代碼,不必要的循環堆,等我強烈建議你打開一個問題在Code Review併發布該方法。 順便說一句,你在每次迭代時都會調用你的下載代碼兩次

  • +0

    +1,不要重新發明輪子。 – Mizipzor 2012-08-15 12:58:52

    +3

    這應該是一個評論;它並沒有真正回答他的問題(除非它實際上更快)。 – Daniel 2012-08-15 12:59:12

    +0

    @codesparkle我並沒有說它沒有價值,但重點是你的答案更多的是一個側面問題,它並不直接回答他的問題,所以它更適合評論。但是沒有必要標記,這是寶貴的建議,只是沒有以正確的形式IMO。 – Daniel 2012-08-15 13:07:44

    1

    只是一些想法

    1集request.Proxy爲null。這可能有助於加速。

    2-在功能Conditions使用HttpUtility.HtmlDecode代替字符串操作

    3-不要使用字符串操作來解析的HTML(如在GetProfileNamesGetTextFromProfile)。改爲使用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();