0

背景:
C#.Net (.Net 4.0) Web サイトを持っています。エンジンを呼び出して、変更できないベンダー実行可能ファイルを介して外部データベースからデータを取得します。ユーザーが特定のボタンをクリックするたびに、Web ページはエンジンにいくつかのスレッドを生成するように指示し、各スレッドは実行可能ファイル (ABC.exe と呼びましょう) のプロセスを生成してデータを取得します。実行可能ファイルが実行され、取得したデータがサーバー上の CSV ファイルに保存されます。次に、スレッドは最初に CSV を読み取り、すべてのデータを統合して計算を行い、Web サイトに戻ります。

問題:
Web サーバー (Windows 7、4 つの仮想プロセッサを実行) 上の IIS 7.5 に Web サイトを展開したときに、4 つを超えるスレッドを生成すると、プロセスがスタックします。

テストが行​​われました:

  1. 同じサーバーで Visual Studio を使用して正確なコードを実行すると、エラーは発生しませんでした。すべてのスレッドが正しく生成され、すべてのプロセスが正しく実行されています。これは非常に奇妙です。
  2. 2 人のユーザーがボタンをクリックし、両方のクリックで 4 つのスレッドが生成された場合、最初の 4 つのスレッドは正しく機能しますが、2 番目の 4 つのスレッドはそのままスタックします。
  3. 接続を実行しないさまざまな実行可能ファイルでスレッドを実行すると、コードが機能します。
  4. このコードでは、Task または Thread を使用しても違いはありません。

これは、IIS で特定の IP に許可されている送信接続と関係があるのではないかと考えています。

誰でもこれに光を当てることができますか?さらに情報が必要な場合はお知らせください。ありがとう!

4

1 に答える 1

0

いくつかの考え:

  1. これは、スレッド プールのスレッドに関連付けられている可能性がありますか? CLR は、存在するプロセッサよりも多くのスレッドをスレッド プール スレッドで (最初はとにかく) 配布しないことで、CPU が不必要にスピンするのを防ごうとします。4 つの仮想プロセッサが存在しますか? ただし、スレッド プールのスレッドは最終的に再開する必要があるため、スレッドが実際にスタックしており、シリアルで実行されていないことを確認してください。
  2. C# で標準出力をリダイレクトするときにデッドロック状態になることを知っています。MSDNの記事を再確認して、これが発生していないことを確認してください。

追加の考え:
この時点で、ABC.exe が疑わしいようです。サーバー上に Visual Studio があるので、Visual Studio の別のインスタンスを起動し、ABC.exe プロセスの 1 つに接続して、ハングしている場所を確認することをお勧めします。cmd /c dirまた、たとえばABC.exe の代わりに、終了することが合理的に確信できるものを実行してみてください。

編集: 5/29:
IIS がアウトバウンド接続をこのように制限するとは信じがたいです。ABC.exe の代わりに、次の単純なダウンロードを試してください。

class Program
{
    public static void Main(string[] args)
    {
        using (var reader = new System.IO.StreamReader(
            System.Net.HttpWebRequest.Create("http://www.google.com")
            .GetResponse().GetResponseStream()))
        {
            System.Console.WriteLine(reader.ReadToEnd());
        }
    }
}
于 2013-05-29T04:22:16.093 に答える