Visual Studio中的内存分配!

时间:2011-06-08 05:03:04

标签: visual-studio web-services memory-management

我有一些示例网络服务,如下所示,

<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

通常情况下,我们总是在使用后关闭连接, 但从来没有采取过密切的方法。
我的一些朋友说过 webservice是无状态的方法,无论我们是否有 关闭与否。这是真的吗?我也知道cnn对象的生命时间是在 只有那个方法和visualstudio才会把它放在那个方法的末尾 我真的想知道对象的生命周期,它们在内存上的分配方式以及它们在使用后的处理时间。

最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

您不需要显式调用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

使用块确保在离开代码块时处理连接。一旦垃圾收集开始,整个事情将被永久删除。

您可能想要考虑新的错误处理策略,因为您没有向客户端提供任何信息(或者在适当的情况下,用户)可以决定如何处理该错误。

答案 1 :(得分:1)

如果您关闭连接,这很重要。 SQL Server对于延迟的未关闭连接非常有弹性,但是如果您使用Access,则在尝试连接时会很快耗尽可用连接并收到错误消息。

你有一个连接对象和一个命令对象都是一次性的,所以你应该处理它们。让它们超出范围是不够的,.NET内存管理不会那样工作。 IDisposable接口适用于具有需要清除的非托管资源的对象。

如果你没有处理它们,大多数一次性物品都有一个终结器作为后备,因此它们最终会被清理掉,但你想要避免它。您希望尽快处理这些对象,否则它们将保留在内存中,直到垃圾收集器来清理它们。

使用一次性对象的代码周围的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