2012-05-10 14 views
3

ウェブページからhtmlをダウンロードしようとしていますが、10秒後に辞退したいと思います。以下のコードはテキストを正常にダウンロードしますが、10秒以上かかることがあります。タイムアウトが設定されていますが、それは時間がかかるStreamReadingです。接続を閉じたまま10秒後に処理を停止する最善の方法は何ですか?タイムアウトのあるファイルをダウンロード

req.GetResponse()が10秒を超えると、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

時間が4000を好きにReadToEnd

使用

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

セット数、でもSで消費されます最低接続数は、4000文字または8kBをほぼ瞬時に提供するのに十分な帯域幅を持つ必要があります。

読み込みごとにバッファのインデックスを増やすか、8kBバッファを使用して、その内容をダイナミックバッファに繰り返し追加するだけです。

Readをループ内で使用して時間をチェックし、タイムアウトを超えると終了するか、Readがcount未満の値を返した場合に終了します。

また、あなたは、非同期転送にネットからデータを取得するための正しい方法を見たいと思うかもしれません:HttpWebRequest - Asynchronous Programming

+0

+1私は質問を読んだときに私が思っていたものを+1しました。バッファーを使用してください。 – dwerner

+0

これはまさに私がやったことです。ありがとう、私は今、HttpWebRequestを閉じることがほとんどの時間を取っていることを発見しました。私はreq.Abort()を呼び出し、それは5から20秒のどこかにかかります。 – Mark

+0

'req.Abort()'は同期 'GetResponse()'では動作しません – Motes

関連する問題