2

私の会社には、さまざまなマシンでホストされている Web サイトに関連する情報を追跡するアプリケーションがあります。中央サーバーは、チェックするサイトのリストを取得する Windows サービスを実行し、それらのターゲット サイトで実行されているサービスにクエリを実行して、ローカル データの更新に使用できる応答を取得します。

私の仕事は、このプロセスにマルチスレッドを適用して、すべてのサイト (順番に実行するのに約 8 時間かかるほぼ 3000 のサイト) を処理するのにかかる時間を短縮することでした。マルチスレッド化されていない場合、サービスは正常に実行されますが、作業を複数のスレッドに分散させた瞬間 (現在 3 つとウォッチャー スレッドでテスト中)、リモート サービスへの呼び出しが原因であると思われる奇妙なクラッシュが発生します。データを提供することになっています。これは SOAP/XML 呼び出しです。

テスト サーバーで実行すると、サービスはあきらめてタスクを完了しませんが、実行を停止しません。デバッガー (Dev Studio 2010) を実行すると、すべてが停止します。実行すると、数秒後にデバッグが停止しますが、完了したからではありません。例外をスローしたり、メッセージを表示したりしません。ブレークポイントを使用すると、停止するポイントまで歩くことができます。イベントログは私を同じ場所に導きます。他のサイトの Web サービスからの応答を取得しようとするコード行で停止します。繰り返しますが、これはマルチスレッドの場合にのみ行われます。

デフォルトで 2 に設定されている接続数に制限があることを示唆する情報をいくつか見つけました。提案された解決策は、app.config にいくつかのタグを追加することですが、それでも問題は解決していません...

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="20"/>
    </connectionManagement>
</system.net>

許可された接続の数に関連している可能性があると考えていますが、それに関する情報をオンラインでうまく見つけることができませんでした. 私が見逃している簡単なものはありますか?どんな助けでも大歓迎です。

4

1 に答える 1

0
  1. クラッシュはありませんが、奇妙にスタックダンプをエスケープします。そのダンプを調べて、明らかな機能を示しているかどうかを確認してください。
  2. 実際のサービス呼び出しにサードパーティのツールまたはその他のコンポーネントを使用していますか? はいの場合は、ドキュメント/contact-the-person-who-wrote-it をチェックして、それらのコンポーネントがスレッド セーフであることを確認してください。そうでない場合は、大きなタスクが待ち構えています。:) (私は安全ではない DB に取り組んできたので、いくつかのグローバルな静的変数がスローされることは珍しくないと信じてください..)

最後に、これが複数のスレッドによるものであると 100% 確信している場合は、作業中のスレッドにロックを設定します。最初に、main-while-loop 全体をカバーするとします。マルチスレッドであっても、実行をシリアル化したので、理論的にはクラッシュしないはずです。次のステップは、スレッドの範囲に縮小することです。たとえば、main-while-loop には 3 つの関数、たとえば f1()、f2()、f3() があり、f1 をロック解除したまま f2() と f3() のロックを開始します...うまくいけば、問題は f2 または f3() のどこかにあります。私が提案していることを理解していただければ幸いです

これは盲目の人が象を推測するようなものであることはわかっていますが、適切に文書化されていない多くの外部コンポーネントをコードで使用している場合は、これが最善の方法です。

于 2011-08-27T22:02:25.523 に答える