Выделение памяти в VisualStudio! - PullRequest
0 голосов
/ 08 июня 2011

У меня есть пример веб-сервиса, как показано ниже,

<WebMethod()> _
    Public Function ExecuteCMD() As Boolean

        Dim cnn As New Data.SqlClient.SqlConnection        

        Try
        cnn.ConnectionString = "ConnectionString Here"
        cnn.Open()

        Dim cmd As New Data.SqlClient.SqlCommand("CommandText Here", cn)
        cmd.ExecuteNonQuery()

        Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

Обычно мы всегда закрываем соединение после его использования, но никогда не вызывал метод close.
Некоторые из моих друзей сказали, что веб-сервисМетод без сохранения состояния, и не имеет значения
, закрываем ли мы его или нет. Это правда? Я также знаю, что время жизни объекта cnn находится в
, только этот метод и Visualstudio будут располагать его концом этого метода.
Я действительно хочу знать время жизни объектов, как они распределяются по памяти и
когда они удаляются после использования.

С наилучшими пожеланиями,
Чонг

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Неважно, если вы закроете соединение или нет.SQL Server достаточно устойчив к длительным незакрытым соединениям, но если вы, например, используете Access, вы быстро исчерпаете доступные соединения и получите сообщение об ошибке при попытке соединения.

У вас есть объект соединения и командаПредмет, который является одноразовым, поэтому вы должны утилизировать его.Недостаточно выпустить их из области видимости, управление памятью .NET не работает таким образом.Интерфейс IDisposable предназначен для объектов с неуправляемыми ресурсами, которые необходимо очистить.

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

Блок Using вокруг кода, в котором используется одноразовый объект, являетсяхороший способ убедиться, что он расположен правильно.Он использует блок Try...Finally, чтобы гарантировать, что объект всегда располагается, даже если возникает ошибка.

<WebMethod()> _
Public Function ExecuteCMD() As Boolean

  Using connection As New Data.SqlClient.SqlConnection        

    Try
      connection.ConnectionString = "ConnectionString Here"
      connection.Open()

      Using command As New Data.SqlClient.SqlCommand("CommandText Here", connection)
        command.ExecuteNonQuery()
      End Using

      Return True
    Catch ex As Exception
        Return False
    End Try

  End Using

End Function
1 голос
/ 08 июня 2011

Вам не нужно явно вызывать close, так как вызов dispose закроет его для вас.

Если вы немного измените код, то вы можете сделать это

    Public Function ExecuteCMD() As Boolean

    Using cnn As New Data.SqlClient.SqlConnection("ConnectionString Here")

        Try
            cnn.Open()

            Dim cmd As New Data.SqlClient.SqlCommand("CommandText Here", cnn)
            cmd.ExecuteNonQuery()

            Return True
        Catch ex As Exception
            Return False
        End Try

    End Using

End Function

Блок usingгарантирует, что соединение удаляется, однако вы покидаете блок кода.Все это будет удалено навсегда, как только начнется сборка мусора.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...