2012-09-29 28 views
2

我以前從未在此論壇上發帖,但在研究中使用它很多,但是這一次我找不到答案......也許我只是沒有正確表述它。在同一物體上多次撥打新電話

我在Compact Framework項目中使用SqlCeCommand相當多,我一直在研究一段時間,並且因爲內存不足而出現了一些問題,所以我試圖優化非託管代碼部分。

看看這個:

Dim SQLCmd as SQLCeCommand 

SQLCmd = New SQLCeCommand 
SQLCmd.Connection = conndb 
... Process db stuff 

SQLCmd = New SQLCeCommand 
SQLCmd.Connection = conndb 
... Process db stuff 

SQLCmd = New SQLCeCommand 
SQLCmd.Connection = conndb 
... Process db stuff 

SQLCmd.Dispose() 

這是正確的,還是我每次我所說的同一對象上新時間失去了記憶?我之所以這樣做而不是保留對象的同一個實例,是因爲我不必每次都明確設置SQLCmd屬性。因爲有些人可能會使用參數,有些人可能不會,所以我認爲使用新參數會更容易確保一切都很清晰。

任何想法或更好的方法來解決這個問題?

回答

0

在你的代碼中,每次調用New時,前面的引用都會丟失,然後它就是釋放現在未引用的對象的垃圾收集器工作。這種情況發生在垃圾收集器框架決定,是時候找回記憶,因此它不會立即

做更好的工作,你可以使用Using statement

Dim SQLCmd as SQLCeCommand 

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using 

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using 

Using SQLCmd = New SQLCeCommand 
    SQLCmd.Connection = conndb 
    ... Process db stuff 
End Using 

這樣你發生調用爲先前的SqlCmd自動處理並向Garbage Collector提供一個強大的提示來收集未使用的內存。

從MSDN

Managed resources are disposed of by the .NET Framework garbage collector (GC) without any 
extra coding on your part. You do not need a Using block for managed resources. However, 
you can still use a Using block to force the disposal of a managed resource instead of 
waiting for the garbage collector. 
+0

感謝您的輸入,這就是我想過參考迷路。 GC仍然可以使用非託管代碼嗎? – henda79

+0

非託管代碼不在垃圾收集器領域之外,基本上,你自己就像在C/C++中一樣。如果您真的打算使用「非託管資源」,請記住垃圾收集器知道所有受管資源,並且在某個時間點GC將釋放所有關聯的內存和資源。 GC不知道非託管資源,例如文件,流和句柄,因此,如果您沒有在代碼中明確清除它們,那麼最終會導致內存泄漏和資源鎖定。 – Steve

+0

好吧,我認爲這清除了它。但是你不能在using塊之外聲明變量。它必須像'使用SQLCmd = New SqlCeCommand'一樣完成,它必須使用SQLCmd作爲New SqlCeCommand,因爲它不支持後期綁定。感謝您的建議。 – henda79