调试期间是否运行垃圾收集?

时间:2011-08-23 17:50:46

标签: c# garbage-collection

我有一个程序可以打开Excel COM对象,执行一些操作并关闭它。然后我想在文件关闭后移动它。如果我运行没有断点的程序,这可以正常工作。但是,如果我在之前调试模式中进入某些东西我试图移动文件我得到一个IOException:“进程无法访问该文件,因为它正被另一个进程使用。”

那是什么交易?当一个程序被允许以全速运行而不是在我踩过它时,垃圾收集是否表现更好?踩着我的代码做的不仅仅是非常缓慢地运行它吗?调试模式还有其他后果吗?遇到的其他错误只是因为我在调试而没有运行exe?

2 个答案:

答案 0 :(得分:16)

当不在调试器中运行时,垃圾收集的优化方式不同,是的。特别是,CLR可以检测到变量不会用于方法的其余部分,并将其视为不再是GC根。在调试器中,范围中的变量在整个方法中充当GC根,因此您仍然可以使用调试器检查值。

然而,这应该很少成为一个问题 - 它只会影响事情,如果终结者实际执行一些清理,并且如果你明确地及时整理事情(例如, using陈述)你通常不会注意到差异。

答案 1 :(得分:0)

为了记录,我也遇到了几次。我发现这在测试终结器以调试模式调用本机端代码时有效:

((Action)()=>{
   // Do your stuff in here ...
})();

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

垃圾收集器似乎保留了以本地方法范围为根的分配副本,因此,通过创建新的方法范围并退出,GC通常会释放资源。到目前为止,这对于我的调试目的是很好的。