2

私は効果的にこのコードを持っています(これらすべてで非常識に見えますtrycatch、問題を説明するために本当に必要です):

Exception doStuffException = null;
try {
   someComObject.DoStuff();
} catch( Exception e ) {
   doStuffException = e;
   throw;
} finally {
   try {
      someComObject.Cleanup();
   } catch( Exception e ) {
      var processes = Process.GetProcesses();
      foreach( var p in processes ) {
         //log p.Threads.Count and p.ProcessName
      }
      throw;
   }
}

COM オブジェクトは、アウトプロセス サーバー プロセスに存在します。クライアントと COM サーバーの両方が Azure Web ロール内で実行されており、Azure の外部で同じ動作が再発するかどうかはわかりません。

ほとんどの場合、問題なく動作します -正常に実行さDoStuff()れ、次に正常にCleanup()実行されます。一部の特定のデータセットでは、DoStuff()winerror.hでの定義に対応し、「これ以上スレッドをシステムで作成できません」というテキストを含むエラー コードが生成され、実行されて生成されます。すべてのプロセスを列挙するコードが実行され、どのプロセスも実行されませんCOM サーバーをホストしているプロセスのスレッド数は 3 (はい、ちょうど 3 つです) です。System.OutOfMemoryExceptionCleanup()System.Runtime.InteropServices.COMException0x800700A4ERROR_MAX_THRDS_REACHED

COMサーバーが再起動されるまで、ERROR_MAX_THRDS_REACHEDそのCOMサーバーへのすべての呼び出しも発生しますERROR_MAX_THRDS_REACHED

ERROR_MAX_THRDS_REACHED明らかなスレッドの漏れがない場合、何が原因でしょうか?

4

1 に答える 1