我有效地拥有这段代码(所有这些看起来很疯狂try
- catch
es 但我真的需要它们来说明问题):
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()
产生System.OutOfMemoryException
,然后Cleanup()
运行并产生System.Runtime.InteropServices.COMException
错误代码0x800700A4
,该代码对应ERROR_MAX_THRDS_REACHED
于 winerror.h 中的定义并具有文本“系统中无法创建更多线程”。枚举所有进程的代码运行并且没有进程具有任何不合理的线程数,并且托管 COM 服务器的进程的线程数等于 3(是的,只有 3 个)。
一旦ERROR_MAX_THRDS_REACHED
发生,对该 COM 服务器的所有调用也会产生ERROR_MAX_THRDS_REACHED
,直到 COM 服务器重新启动。
ERROR_MAX_THRDS_REACHED
当没有明显的螺纹泄漏时会导致什么?