2009-06-20 54 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为你处理这个问题。