我有一个程序可以打开Excel COM对象,执行一些操作,然后将其关闭。然后我想要在文件关闭后移动它。如果我在没有断点的情况下运行程序,这将工作得很好。但是,如果我在尝试移动文件之前进入调试模式,则会得到一个IOException:“该进程无法访问该文件,因为它正被另一个进程使用。”
那是怎么回事呢?当程序被允许全速运行时,垃圾收集的性能是否比我单步执行时更好?单步执行我的代码不仅仅是非常缓慢地运行它吗?调试模式还有其他后果吗?遇到的其他错误,只是因为我在调试中,没有运行可执行文件?
发布于 2011-08-24 01:53:11
特别是,CLR可以检测到某个变量不会用于方法的其余部分,并将其视为不再是GC根。在调试器中,作用域中的变量在整个方法中充当GC根,因此您仍然可以使用调试器检查这些值。
然而,这应该很少是问题-它应该只在终结器实际执行一些清理时才会影响事情,如果你显式地及时清理东西(例如使用using
语句),你通常不会注意到区别。
发布于 2019-03-15 06:35:50
根据记录,我也遇到过几次这样的情况。我发现在调试模式下测试调用本机代码的终结器时,这是有效的:
((Action)()=>{
// Do your stuff in here ...
})();
GC.Collect();
GC.WaitForPendingFinalizers();
垃圾收集器似乎将分配的副本保存在本地方法作用域中,因此通过创建新的方法作用域并退出,GC通常会释放资源。到目前为止,这对于我的调试目的来说工作得很好。
https://stackoverflow.com/questions/7165353
复制相似问题