私は効果的にこのコードを持っています(これらすべてで非常識に見えます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.OutOfMemoryException
Cleanup()
System.Runtime.InteropServices.COMException
0x800700A4
ERROR_MAX_THRDS_REACHED
COMサーバーが再起動されるまで、ERROR_MAX_THRDS_REACHED
そのCOMサーバーへのすべての呼び出しも発生しますERROR_MAX_THRDS_REACHED
。
ERROR_MAX_THRDS_REACHED
明らかなスレッドの漏れがない場合、何が原因でしょうか?