2012-05-10 80 views
3

我試圖從網頁上下載html,但是我想在10秒後放棄。下面的代碼很好地下載了文本,但它可能需要超過10秒。我有超時設置,但StreamReading需要很長時間。在關閉連接的情況下10秒後停止進一步處理的最佳方式是什麼?用超時下載文件

如果req.GetResponse()需要的時間超過10秒,我得到一個WebException,但是wr.GetResponseStream()讀取是花費時間。我也想確保所有連接都正確關閉。

代碼:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
req.Timeout = 10000; 
req.ReadWriteTimeout = 10000; 

using (WebResponse wr = req.GetResponse()) 
{ 
    Console.WriteLine("A: " + DateTime.Now.ToString(" HH:mm:ss:fff")); 

    using (StreamReader sr = new StreamReader(wr.GetResponseStream(), true)) 
    { 
    Console.WriteLine("B: " + DateTime.Now.ToString(" HH:mm:ss:fff")); 
    var b = sr.ReadToEnd(); 
    Console.WriteLine("C: " + DateTime.Now.ToString(" HH:mm:ss:fff")); 
    } 
} 

樣本輸出:

A: 20:04:36:522 
B: 20:04:36:522 
C: 20:04:54:337 

Elapsed Time: ~18 Seconds 
+0

請不要使用前綴與您的標題「C#:」和這樣的。這就是標籤的用途。 –

回答

1

時間以ReadToEnd

使用

public virtual int Read(
    char[] buffer, 
    int index, 
    int count 
) 

設定計消費喜歡4000,即使在S最低連接應該有足夠的帶寬來提供4000個字符或8kB幾乎是瞬間的。

確保在每次讀取之間增加緩衝區的索引,或者可以使用8KB緩衝區,並且每次迭代時將其內容添加到動態緩衝區。

在循環內部使用Read,該循環檢查時間並在大於超時時退出,或者如果Read返回小於count的值則退出。

此外,您可能想看看異步傳輸,以正確的方式從網上得到的數據:HttpWebRequest - Asynchronous Programming

+0

+1正如我在讀這個問題時所想的那樣。使用緩衝區。 – dwerner

+0

這正是我最終做的。謝謝我現在發現,關閉HttpWebRequest大部分時間都在使用。我稱之爲req.Abort(),它需要5到20秒的時間。 – Mark

+0

'req.Abort()'不適用於同步'GetResponse()' – Motes