关于.NET中内存泄漏的问题

时间:2009-06-20 15:23:18

标签: .net memory-leaks

我的C#代码中有一些内存泄漏 我有一个类,里面有一些SqlCommand字段。 我还有一个Initialize()公共方法,它分配这些SqlCommands字段。

在分配之前,我检查(在Initialize的代码中)是否第一次进行分配(即不是第一次调用Initialize),如果不是第一次 我在SqlCommands上调用Dispose,它似乎导致内存泄漏......

现在重要的是要提到所有SqlCommands都使用相同的 SqlConnection和这个连接在整个程序的生命周期中都是活跃的。 通过某些静态类的静态属性访问连接... (我们称之为ConnectionManager)

知道可能是什么问题吗?     谢谢!

2 个答案:

答案 0 :(得分:6)

Krembo,使用SqlConnection和SqlCommand对象的推荐方法是在using语句中,如MSDN的示例代码所示:

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

你应该在使用完SqlConnection对象后立即处理它,虽然看起来这很慢,但在幕后,连接池将消除大部分开销。

答案 1 :(得分: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();
}

正如Luke Girvin所说,如果您只是想节省数据库连接,则可能不需要静态ConnectionManager类。 .NET会为你处理这个问题。