2

これが正確にどのように機能するかを理解しようとしています。

HttpWebRequestBeginGetResponseパラメータとして a を受け入れるメソッドがありますResponseCallback。まず、このコールバックはすぐに(新しいスレッドで) 呼び出されますか、それともサーバーからの応答を受信したらすぐに呼び出されますか? それともEndGetResponse返事を待つのが仕事?

第 2 に、応答を取得したらすぐに応答ストリームにアクセスできますが、ストリームにはダウンロードが完了するまでページ全体が含まれないため、BeginRead. ただし、のようなプロパティを介して、すべてのヘッダーにすぐにアクセスできるようHttpWebResponse.ContentLengthです。EndGetResponseこれは、ヘッダーが完全にダウンロードされるまで完了しないということですか、それとも、ContentLengthパラメーターを呼び出すと、そのヘッダーが受信されるまで少しハングするということですか?

4

1 に答える 1

5

Begin* と End* のパターンは常に同じです。

  • Begin に AsyncCallback を渡す
  • そのコールバックの呼び出しを待ちます (即時ではありません)
  • 常にコールバックでEnd*を呼び出す
  • コールバック/IAsyncResult の成功を確認します (キャンセルされましたか?例外/エラーはありますか?)
  • ここで End* の結果を使用します。

あなたの場合の結果は、ヘッダーを含む WebResponse インスタンスです。したがって、応答のその部分は既に受信されていると想定しても安全だと思います。WebResponse オブジェクトには、そのプロパティに隠された非同期魔法はありません。ContentLength にアクセスする場合、それは単なる通常のプロパティであり、オブジェクトは、ブロッキングまたは非同期呼び出しを使用して取得したかどうかを認識または気にしません。

于 2009-12-27T22:45:33.543 に答える