3

Webページから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
4

1 に答える 1

1

で消費される時間ReadToEnd

使用する

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

countを4000のように設定すると、最も遅い接続でも、4000文字または8kBをほぼ瞬時に提供するのに十分な帯域幅が必要になります。

読み取りのたびにバッファーのインデックスをインクリメントするようにしてください。そうでない場合は、8kBバッファーを使用して、反復ごとにその内容を動的バッファーに追加することができます。

Read時間をチェックし、タイムアウトよりも大きい場合は終了するかRead、count未満の値を返す場合は終了するループ内で使用します。

また、ネットからデータを取得する正しい方法である非同期転送を調べることもできます。HttpWebRequest-非同期プログラミング

于 2012-05-10T02:38:33.310 に答える