2011-07-14 41 views
2

私はWebクローラーで作業しています。私はHttpWebRequestを使用したいと思います。それはBeginGetResponseのような非同期操作を可能にしますが、HttpWebRequest.Createを使用した接続は非同期ではありません - 同時に約1,000の接続をしたいので、(非同期のために余分なスレッドを使って)このメソッドを使用すると、 2番目の接続がすでにコンテンツのダウンロードを完了している最初の接続を接続するまで、そしてほぼ同時に私のページの後にWebページに接続しているかのようです。非同期HttpWebRequest

私は事前に

おかげで...スレッドか何かのトンを作成せずにHttpWebRequestのを使用して約1,000倍を接続するための良い方法があるのか​​と思いまして。

編集: 最終的には、遅くブロックされていたHttpWebRequestではなく、BeginGetResponseでした。要求ヘッダーが送信されるまでブロックされていますか?どのように私はこれをバイパスすることができます、BeginGetRequestStreamと同様に非同期送信を使用する?

答えて

1

これらの接続はすべて同じドメインにありますか?あなたのアプリにこれを追加すること

のtry/web.configファイル

<system.net> <connectionManagement> <追加アドレス= " * " MAXCONNECTION = " 1000年"/> </connectionManagement > </system.net >

0

同じスレッドで複数の接続を行うことはできません。接続ごとに1つのスレッドが必要です。しかし、設計を変更してスケーラビリティを高めることができます。

すべての重い吊り上げ(または多分これらのいくつか)を行うコントロールスレッドを1つ作ることができます。そして、そのようなコントロールスレッドは、出て行くデータを取得して親の中に何らかの種類の配列クラス。次に、コントロールクラスは子スレッドをリサイクルできます。子スレッドが終了すると、別の「タスク」が得られます。主なアイデアは、検索されたデータの処理からクロールを分離することです。それを入手し、保管し、後で処理する。

希望これは、いくつかの方法で役立ちます:)

+0

最終的には、遅くブロックされていたHttpWebRequestではなく、BeginGetResponseでした。要求ヘッダーが送信されるまでブロックされていますか?どのように私はこれをバイパスすることができます、BeginGetRequestStreamと同様に非同期送信を使用する? – Symbol

0

このを遮断する必要があることを理由はありません。非同期Web要求がどのように動作するかについて、いくつかの奇妙なことがあります。これは、想定される非同期要求を強制的に同期させる可能性があります。まず第一に、あなたが実際にデータを掲載している場合、あなたはBeginGetRequestStream(あなたは非同期と同期を混在させることはできません)を参照してください使用する必要があります:私が正しくリコールhttp://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

を何も実際にWebRequest.Createで起こらない、それだけで、オブジェクト、要求を設定しますBeginGetRequestStreamまたはBeginGetResponseのいずれか(POSTかgetかに応じて)まで開始されません。

私の知見によれば、EndGetResponseからのストリームを読み込むのには、要求より多くの遅延があります。また、ストリーム上の非同期バージョンの読み込みを使用する必要があります。