2011-08-23 58 views
4

我有一個程序,打開一個Excel COM對象,做一些東西,並關閉它。然後我想在文件關閉後移動該文件。如果我沒有斷點運行程序,這工作正常。但是,如果我在調試模式下步入之前我試圖移動該文件,我得到一個IOException:「該進程無法訪問該文件,因爲它正在被另一個進程使用。」垃圾收集是否在調試過程中運行?

那麼有什麼交易?當程序被允許全速運行時,垃圾收集是否表現更好,而不是在我逐步完成時呢?通過我的代碼不僅僅是慢慢地運行它而已?調試模式有其他後果嗎?其他錯誤,只是因爲我在調試而不運行exe文件而遇到?

回答

12

當不在調試器中運行時,垃圾收集的優化方式會有所不同,是的。特別是,CLR可以檢測到某個變量不會用於其他方法,並將其視爲不再是GC根。在調試器中,作用域中的變量充當整個方法中的GC根,因此您仍然可以使用調試器檢查這些值。

然而,這應該很少是一個問題 - 它只會影響的事情,如果一個終結實際執行一些清理,如果你是明確收拾東西及時地(例如用using語句)你通常不會注意到其中的差異。

+0

所以我可以期望我的程序在不運行調試器時運行得更快嗎?調試器故意佔用更多的內存......所以我可以調試。對?無論哪種方式,我不明白爲什麼我的斷點的位置會影響對象是否可用。如果我點擊F5並用零中斷點測試我的代碼並從不「進入」,那麼Debugger仍然執行與常規構建不同的操作嗎? – Brad

+1

@布拉德:「快得多」是非常主觀的。說實話,目前還不清楚你在做什麼 - 但使用F5運行仍在使用調試器; Ctrl-F5不。這不是你正在運行的* build *的問題,它是*你如何運行它。 (你可以在調試器中運行發佈版本,或者不在調試器中運行調試版本。) –

+0

因此,如果我運行的調試版本不在調試器中,像Debug.Print()這樣的行仍然會被執行?他們在發佈版本中被忽略了嗎? – Brad

0

你如何處理Excel對象的處理?

如果在VS調試器停止後您發現錯誤並且讓代碼運行COM對象處理,那麼您可能有一個有效的點。