2012-09-29 79 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