垃圾收集器未以相同的方法处理Excel实例

问题描述 投票:0回答:1

我有一个使用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();
        }
c# excel garbage-collection excel-interop
1个回答
0
投票

垃圾收集器仅回收未使用的内存。终结器可用于回收其他类型的资源。但是,终结器是不确定的,可能永远无法运行。因此,我认为设计良好的程序应始终使用IDisposable接口来回收任何本机资源,而仅使用终结器作为后备。简而言之,您应该(理想情况下)永远不必调用Gc.Collect或Gc.WaitForPendingFinalizer。

由于“应用程序”未实现IDisposable,但显然具有终结器,因此似乎该对象的设计不良。

最后一次使用后,垃圾收集器可以随时回收对象。但这可能取决于您是在调试还是发行版中运行,以及是否连接了调试器。编译器可能会延长生存期,从而使调试更加容易。据我所知,两个示例都应该工作相同,如果不行,则可能不应该依赖某些复杂的,未记录的行为。

© www.soinside.com 2019 - 2024. All rights reserved.