垃圾收集器是否受益于对Collect和WaitForPendingFinalizers()的多次调用?

B. *_*non 3 c# garbage-collection office-interop collect

我发现这个在线代码是在取消初始化Excel Interop对象后附加的:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

这是对DRY的准违反(以口吃的方式连续两次调用GC.Collect()和GC.WaitForPendingFinalizers())有什么用处,或者只是浪费时间?

Han*_*ant 5

垃圾收集器是否受益于多个调用...

你不是这样做有利于GC,远非如此,你这样做是为了强制Excel.exe终止.它不能停止,直到所有的interop包装器(RCWs)完成.单个GC.Collect()调用足以设置该列车运动.

随后的GC.WaitForPendingFinalizers()调用是可选的.没有什么理由想要等到它们完成.在一个表现良好的程序中,这最多只能在几毫秒内完成.如果拥有这些interop包装器的线程将要终止,那么这一点非常重要.这并不常见.如果您不确定那么使用它没有错.

第二次收集+等待呼叫没用.RCW非常小,因此Collect调用不会释放任何有用的内存量.等等无法等待.

放置此代码往往很重要.如果它出现在使用Excel接口的相同方法中,则在附加调试器时它将不会执行任何操作.将它放在方法的调用者中是最好的.为什么调试器发挥作用在解释这个职位.