2009-06-20 53 views
-1

我在C#代碼中有一些內存泄漏 我有一個內部包含一些SqlCommand字段的類。 我也有一個Initialize()公共方法來分配這些SqlCommands字段。.NET中內存泄漏的問題

在分配之前,我檢查(在初始化的代碼中)是否不是第一次分配(即不是第一次調用Initialize),如果這不是我第一次在SqlCommands上調用Dispose,並且它似乎會導致內存泄漏....

現在必須指出,所有SqlCommands都使用相同的SqlConnection,並且該連接在整個程序生命週期中都處於活動狀態。 通過一些靜態類的靜態屬性訪問連接... (我們稱之爲ConnectionManager)

任何想法可能是什麼問題? 謝謝!

+0

我想你需要提供更多的信息/代碼示例 – RichardOD 2009-06-20 15:28:10

回答

6

Krembo,使用的SqlConnection和SqlCommand的對象的推薦方法是使用語句中,如從MSDN此示例代碼:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 
    // Do work here; connection closed on following line. 
} 

你或許應該儘快你處置您的SqlConnection對象」我們已經完成了使用它,雖然看起來這會很慢,但在幕後,連接池將消除大部分開銷。

2

你應該發佈一些相關的代碼。沒有它,我只是猜測。然而,這裏有一個猜測:

您在這裏跟隨錯誤的模式。由於您的類維護實現IDisposable的對象,因此您的類應該實現IDisposable本身。然後,您的訪問者應該改爲調用你的類的Dispose方法,他們就完成了,當它:

using System; 
using System.Data.SqlClient; 

public static class ConnectionManager 
{ 
    private static readonly SqlConnection _connection = 
     new SqlConnection("connectionString"); 
    public static SqlConnection Connection { get { return _connection; } } 
} 

public class HoldsCommands : IDisposable 
{ 
    private readonly SqlCommand _commandOne = new SqlCommand("Command1"); 
    private readonly SqlCommand _commandTwo = new SqlCommand("Command2"); 

    public void DoSomethingWithAConnection() 
    { 
    } 

    public void Dispose() 
    { 
     if (_commandOne != null) 
     { 
      try 
      { 
       _commandOne.Dispose(); 
      } 
      catch (Exception) 
      { 
      } 
     } 

     if (_commandTwo != null) 
     { 
      try 
      { 
       _commandTwo.Dispose(); 
      } 
      catch (Exception) 
      { 
      } 
     } 
    } 
} 

那麼你的來電者會叫你這個樣子:

using (var commands = new HoldsCommands()) { 
    commands.DoSomethingWithAConnection(); 
} 

路加福音格文說,你可能如果您只是想保存數據庫連接,則不需要靜態ConnectionManager類。 .NET爲你處理這個問題。