3

C# を使用して、WebRequest からの応答の受信を開始するのにかかる時間を特定する必要があります (現時点では、完全な応答をダウンロードするのにかかる時間は気にしていません)。

私が理解できることから、これを行うには、WebRequest の非同期メソッドを使用する必要があります。これが私が思いついたものです:

public TimeSpan TimeToFirstBit(string url)
{
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  request.Accept = "*/*";

  DateTime? firstBit = null;
  DateTime start = DateTime.Now;

  IAsyncResult asyncResult = request.BeginGetResponse(
      (async) => { firstBit = DateTime.Now; },
      null);

  asyncResult.AsyncWaitHandle.WaitOne();
  request.EndGetResponse(asyncResult);

  TimeSpan result = start - firstBit.Value; 
  // Previous line generates a System.InvalidOperationException: 
  // "Nullable object must have a value."

  return result;

}

これにより、「Nullable オブジェクトには値が必要です」という結果になります。これは、WaitOne() メソッドと EndGetResponse メソッドが実際には非同期呼び出しの完了を待っていないことを示しているようです。

では、BeginGetResponse() が完了するまで待つにはどうすればよいでしょうか。そして、これは実際にリクエストの応答時間を決定する正しい方法ですか?

4

1 に答える 1

4

ネットワーク上の要求と応答の間のレイテンシーを知りたいだけの場合は、Fiddler などのネットワーク パケット スニファーを使用してください。インプロセス タイマーよりも、パケット レベル ツールからのタイミングの数値の方が信頼できます。処理中の測定値は、.net スタックのオーバーヘッドを含めることで、わずかに歪む可能性があります。サーバーの応答速度を知りたい場合は、クライアントのオーバーヘッドを含めたくありません。

于 2012-06-10T06:33:58.570 に答える