2012-09-29 4 views
2

Я никогда не писал на этом форуме раньше, но использовал его для исследования, но на этот раз я не смог найти ответ ... возможно, я просто не формулирую его правильно.Вызов нового многократного использования на том же объекте

Я использую SqlCeCommand довольно много в проекте Compact Framework, над которым я работал некоторое время, и у меня было много проблем с нехваткой памяти, поэтому я пытаюсь оптимизировать неуправляемые части кода лучше ,

Взгляните на это:

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

В вашем коде каждый раз, когда вы вызываете Новое, предыдущая ссылка теряется, а затем это сборщик мусора, который освобождает объект, не привязанный к объектам. Это происходит, когда структура сборщика мусора решает, что настало время, чтобы вернуться к памяти и, таким образом, это не происходит сразу

Чтобы сделать лучшую работу, которую вы могли бы использовать 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 

Таким образом, вы вызовите Dispose автоматически для предиума SqlCmd и передайте сборщику мусора сильный намек на сбор неиспользуемой памяти.

Из 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

Неуправляемый код находится за пределами области Garbage Collector, в основном вы сами по себе, как на C/C++. Если вы действительно намереваетесь «неуправляемый ресурс» вместо этого, имейте в виду, что сборщик мусора знает обо всех управляемых ресурсах, и в какой-то момент GC освободит всю связанную память и ресурсы. GC не знает о неуправляемых ресурсах, таких как файлы, потоки и дескрипторы, поэтому, если вы не очищаете их явно в своем коде, тогда вы получите утечки памяти и заблокированные ресурсы. – Steve

+0

хорошо, я думаю, что это очищает. Однако вы не можете объявить переменную за пределами используемого блока. Это должно быть сделано как «using SQLCmd = New SqlCeCommand», и это компактная структура, которая должна быть «использованием SQLCmd как новой SqlCeCommand», поскольку она не поддерживает позднюю привязку. Спасибо за совет. – henda79

Смежные вопросы