需要澄清正确清理 Excel Interop 对象的答案
Need Clarification On Answer For Cleaning Up Excel Interop Objects Properly
关于 Hans Passant 对问题的回答...Clean up Excel Interop Objects with IDisposable ...
他告诉我,我不需要遵循两点规则...声明所有 com 对象,这样我就可以在完成后通过 Marshal.ReleaseComObject 释放它们。所以现在我知道我可以在我的 Excel 代码之后调用 GC.Collect 和 GC.WaitForPendingFinalizers 并且所有对象都将被正确释放。其一,我认为这很好,并且会减少我用 c# 编写的宏的长度,但我习惯于在完成宏 运行 时尽快释放对象,以最大限度地减少内存使用。我应该关注在我去的时候清理对象,还是像汉斯建议的那样在宏的末尾进行清理就可以了?我通常处理大文件,我的宏会创建许多 com 对象来完成任务。
I was in the habit of releasing objects as soon as I was done with them to minimize memory usage while the macro ran. Should I be concerned with cleaning up objects as I go or is it ok to just do a cleanup at the end of the macro like Hans suggested?
作为一般规则,在您使用完任何资源后立即释放它。 and/or 资源越稀缺,它就变得越重要。数据库连接、内存、文件句柄等也是如此。
它对 COM 对象的引用也有效。
话虽如此,表演
GC.Collect();
GC.WaitForPendingFinalizers();
释放您的尽快清理可能捕获的任何引用是明智之举。
有一个反驳,你可以运用常识并考虑你自己的情况。您最终会编写更多代码来清理每个 COM 引用。如果您在达到可以清理的点之前没有创建过多的 COM 对象,那么选择更简单的代码(例如使用双点)可能是值得的,因为您知道您暂时消耗的资源比绝对需要的要多.
关于 Hans Passant 对问题的回答...Clean up Excel Interop Objects with IDisposable ...
他告诉我,我不需要遵循两点规则...声明所有 com 对象,这样我就可以在完成后通过 Marshal.ReleaseComObject 释放它们。所以现在我知道我可以在我的 Excel 代码之后调用 GC.Collect 和 GC.WaitForPendingFinalizers 并且所有对象都将被正确释放。其一,我认为这很好,并且会减少我用 c# 编写的宏的长度,但我习惯于在完成宏 运行 时尽快释放对象,以最大限度地减少内存使用。我应该关注在我去的时候清理对象,还是像汉斯建议的那样在宏的末尾进行清理就可以了?我通常处理大文件,我的宏会创建许多 com 对象来完成任务。
I was in the habit of releasing objects as soon as I was done with them to minimize memory usage while the macro ran. Should I be concerned with cleaning up objects as I go or is it ok to just do a cleanup at the end of the macro like Hans suggested?
作为一般规则,在您使用完任何资源后立即释放它。 and/or 资源越稀缺,它就变得越重要。数据库连接、内存、文件句柄等也是如此。
它对 COM 对象的引用也有效。
话虽如此,表演
GC.Collect();
GC.WaitForPendingFinalizers();
释放您的尽快清理可能捕获的任何引用是明智之举。
有一个反驳,你可以运用常识并考虑你自己的情况。您最终会编写更多代码来清理每个 COM 引用。如果您在达到可以清理的点之前没有创建过多的 COM 对象,那么选择更简单的代码(例如使用双点)可能是值得的,因为您知道您暂时消耗的资源比绝对需要的要多.