我有一个使用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();
}发布于 2020-03-19 23:46:10
垃圾收集器只回收未使用的内存。终结器可用于回收其他类型的资源。但是,终结器是不确定的,并且可能永远不会运行。因此,我认为设计良好的程序应该始终使用IDisposable接口来回收任何本机资源,并且只使用终结器作为后备。简而言之,您应该(理想情况下)永远不需要调用Gc.Collect或Gc.WaitForPendingFinalizer。
由于“应用程序”没有实现IDisposable,但显然有一个终结器,看起来对象设计得不是很好。
允许垃圾收集器在最后一次使用后的任何时间回收对象。但这可能取决于您是在debug还是在release中运行,以及是否附加了调试器。编译器有可能延长生命周期,使调试变得更容易。因此,据我所知,这两个示例应该是相同的,如果不是这样,可能是一些复杂的、未记录的行为,不应该依赖。
https://stackoverflow.com/questions/60754546
复制相似问题