私は効果的にこのコードを持っています(これらすべてで非常識に見えますtryがcatch、問題を説明するために本当に必要です):
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明らかなスレッドの漏れがない場合、何が原因でしょうか?