我的C#代码中有一些内存泄漏 我有一个类,里面有一些SqlCommand字段。 我还有一个Initialize()公共方法,它分配这些SqlCommands字段。
在分配之前,我检查(在Initialize的代码中)是否第一次进行分配(即不是第一次调用Initialize),如果不是第一次 我在SqlCommands上调用Dispose,它似乎导致内存泄漏......
现在重要的是要提到所有SqlCommands都使用相同的 SqlConnection和这个连接在整个程序的生命周期中都是活跃的。 通过某些静态类的静态属性访问连接... (我们称之为ConnectionManager)
知道可能是什么问题吗? 谢谢!
答案 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会为你处理这个问题。