5

WebtestingツールのURLリストに基づいてHTMLページソースを取得する.NET 4ヘルパー/ユーティリティークラスを実装しようとしています。ソリューションはスケーラビリティがあり、高性能でなければなりません。非同期Webリクエストのマルチスレッド化方法

私は数日前にさまざまなソリューションを研究してきましたが、適切な解決策を見つけることはできません。

私の理解に基づいて、私の目標を達成するための最良の方法は、TPLを使用して並列実行する非同期Webリクエストを使用することです。

ヘッダーなどをフルコントロールするために、HttpWebResponseをラップしているWebClientの代わりにHttpWebResponseを使用しています。場合によっては、出力を他のタスクに連鎖する必要があり、TPLタスクを使用することが理にかなっています。

私は多くの異なった臨床試験/アプローチした後、これまでに達成した何を、

  1. は、さまざまなソリューションのパフォーマンスレベルを確認するための基本的な同期、非同期(APM)とパラレル(TPLタスクを使用して)ソリューションを実装します。

  2. 私は非同期並列ソリューションのパフォーマンスを見るために、私はAPMアプローチBeginGetResponseとBeginReadを使用し、Parallel.ForEachで実行しました。すべてうまく動作し、私はパフォーマンスに満足しています。どういうわけか、私は単純なParallel.ForEachを使うのは道のりではなく、たとえば私はどのように私が仕事の連鎖を使うのか分からないと感じています。

  3. 次に、TaskCompletionSourceとイテレーターを使用してAPMフローを繰り返してAPMソリューションをラップするタスクを使用して、より洗練されたシステムを試しました。私はこの解決策が私が探しているものかもしれないと信じていますが、500のURLリストを実行しているときに2-3回起こる、奇妙な遅延があります。

    ログに基づいて、遅延が発生したときにループ内でasync fetchを呼び出しているスレッドに実行が戻ってきました。実行がループに戻ったときに遅延は常に発生しません。わずか2〜3回、それ以外の時間は正常に動作します。ループスレッドが他のスレッドによって処理される一連のタスクを作成し、大部分/すべてのタスクが完了している間にループが残りのタスクの作成を続行し、他のスレッドが再びアクティブになるまでの遅延(6-8秒) 。

ループ内部イテレータの原理は次のとおりです。

IEnumerable<Task> DoExample(string input) 
    { 
    var aResult = DoAAsync(input); 
    yield return aResult; 
    var bResult = DoBAsync(aResult.Result); 
    yield return bResult; 
    var cResult = DoCAsync(bResult.Result); 
    yield return cResult; 
    … 
    } 

Task t = Iterate(DoExample(“42”)); 

は私が

私の質問ThreadPool.RegisterWaitForSingleObject

使用System.Net.ServicePointManager.DefaultConnectionLimitとタイムアウトを使用して接続制限を解決しています単純に、htmlページを取得するためのヘルパー/ユーティリティークラスを実装する最良の方法は何ですか:

  • はスケーラブルで、高い性能を有する
  • 使用は
  • をwebrequests簡単
  • がタイムアウト
  • 使用を使用することができ、他のタスクにチェーンします。NETフレームワーク4

あなたは、私が上記のAPM、TaskCompletionSourceとイテレータを使用しての解決策は、私は遅延の問題を解決しようとするための任意の助けをいただければ幸い罰金と思われる場合。

私はC#とWindowsの開発に全く新しいので、私が試しているものがあまり意味を持たない場合は気にしないでください。

私はテストツールの開発を中止する必要がありますが、これを解決しなければ非常に感謝しています。イテレータを使用して

おかげ

+0

イテレータをどのように使いこなしているのか、イテレータとして実際に使用するのはなぜ有用であると思いますか? – svick

+0

さまざまなソリューションを試した後、msdnブログのMS専門家のアドバイスに基づいてイテレーターを使用して終了しました。私のソリューションは、ブログとほぼ同じですが、タイムアウトとロギングが追加されました。イテレータを使用する特別な理由はありませんし、動作するソリューションには何も公開されていません。コードスニペットへのリンク:http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/95355648-1fa6-4b2d-a260-954c3421c453/ – Laowai

答えて

0

は(例えば、MSロボティクスのうちコーディネーションおよび同時実行ランタイム(CCR)は、それらの多用を作り、TPLを鼓舞助けた)前TPL .NETの最適なソリューションでした。 1つの問題は、イテレーターだけでは必要なものが得られないことです。作業負荷を効果的に分散させるスケジューラーも必要です。それはあなたがにリンクされているスティーブンToubのスニペットによって行わほとんどだ - しかし、1行ことに注意してください:

enumerator.Current.ContinueWith(recursiveBody, TaskContinuationOptions.ExecuteSynchronously); 

は、私はあなたが「ExecuteSynchronouslyを」強制にリンクされる可能性があります見ている断続的な問題を考える - それが引き起こしている可能性があります使用可能なコア/スレッド間での作業の不均一な分散。

スティーブンが提案している他の選択肢のいくつかをご覧くださいin his blog article。具体的には、ContinueWith()呼び出しが単純に連鎖するだけで何が行われるかを見てください(必要ならば、Unwrap()呼び出しに一致します)。シンタックスは最も美しいものではありませんが、最も単純なもので、基本的な作業窃盗ランタイムとできるだけ干渉しないため、より良い結果が得られるはずです。

+0

お寄せいただきありがとうございます。私はスティーブンのブログを詳しく見ていきます。 – Laowai

+0

あなたが何を見つけるのか教えてください... –

関連する問題