2011-06-08 43 views
0

我有一些样品webservice的类似下面,VisualStudio中的内存分配!

<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方法。
我的一些朋友说, Web服务是无状态的方法,它并不重要
我们是否有 将其关闭或not.Is是真的吗?我也知道,CNN对象的生命时间是
只是方法和VisualStudio的意志处理该方法的结束。
我真的很想知道对象的使用寿命,它们在内存中的分配情况,以及在使用后如何处理它们的情况下

最好的问候,

回答

1

如果您关闭连接或没有关系,这很重要。 SQL Server对持久的未关闭连接具有很强的适应性,但是如果您使用Access,则在尝试连接时会很快耗尽可用连接并收到错误消息。

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

如果你不能处置它们,大多数一次性物品会有一个终结者作为回退,所以它们最终会被清理干净,但是你想避免这种情况。你想尽快处理这些对象,否则它们将一直保留在内存中,直到垃圾收集器来清理它们。

A 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 
+0

更好的描述IDisposable比我的。 – 2011-06-08 05:37:14

1

你并不需要显式调用接近调用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块确保连接设置的,但是你离开代码块。整个事情将在permanantly被删除一次垃圾收集踢。

你可能要考虑一下,你是给没有信息返回给客户端的一个新的错误处理策略(或在适当情况下,用户)可以决定该怎么处理这个错误。