gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:07:51 34 4
gpt4 key购买 nike

我在网上找到了这段代码,它是在取消初始化 Excel Interop 对象后附加的:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

这种对 DRY 的准违反(以结结巴巴的方式连续两次调用 GC.Collect() 和 GC.WaitForPendingFinalizers())是否有任何帮助,还是只是浪费时间?

最佳答案

Does the Garbage Collector benefit from multiple calls...

您这样做并不是为了让 GC 受益,远非如此,您这样做是为了强制 Excel.exe 终止。在所有互操作包装器 (RCW) 完成之前,它无法停止。一次 GC.Collect() 调用就足以启动这列火车。

随后的 GC.WaitForPendingFinalizers() 调用是可选的。没有什么理由想等到他们完成。在一个行为良好的程序中,这最多会在几毫秒内发生。仅当拥有这些互操作包装器的线程将要终止时,才需要执行此操作。这并不常见。如果您不确定,那么使用它并没有错。

第二个 Collect+Wait 调用没有用。 RCW 非常小,因此 Collect 调用不会释放任何有用的内存量。等待不能有任何等待。

此代码的放置往往很重要。如果它出现在使用 Excel 接口(interface)的相同方法中,那么在附加调试器时它不会执行任何操作。最好将它放在方法的调用者中。 this post 中解释了为什么调试器起作用.

关于c# - 垃圾收集器是否受益于对 Collect 和 WaitForPendingFinalizers() 的多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000442/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com