我有一个使用Excel-Interop的程序。现在,如果我调用Application.Quit-Method,它不会关闭Excel进程,则必须首先运行垃圾收集器。但是由于某种原因,只有在使用不同于Excel的方法中调用垃圾收集器时,垃圾收集器才能正常工作。
为什么?
public static void MethodA()
{
MethodB();
//Calling the Garbage-Collector here DOES close the Excel-Process
GC.Collect();
GC.WaitForPendingFinalizers();
}
public static void MethodB()
{
Application ExcelApp = new Application();
ExcelApp.Quit();
ExcelApp = null;
//Calling the Garbage-Collector here DOES NOT close the Excel-Process
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
垃圾收集器仅回收未使用的内存。终结器可用于回收其他类型的资源。但是,终结器是不确定的,可能永远无法运行。因此,我认为设计良好的程序应始终使用IDisposable接口来回收任何本机资源,而仅使用终结器作为后备。简而言之,您应该(理想情况下)永远不必调用Gc.Collect或Gc.WaitForPendingFinalizer。
由于“应用程序”未实现IDisposable,但显然具有终结器,因此似乎该对象的设计不良。
最后一次使用后,垃圾收集器可以随时回收对象。但这可能取决于您是在调试还是发行版中运行,以及是否连接了调试器。编译器可能会延长生存期,从而使调试更加容易。据我所知,两个示例都应该工作相同,如果不行,则可能不应该依赖某些复杂的,未记录的行为。