C# 数据表内存泄漏

C# 数据表内存泄漏,c#,.net,ado.net,memory-leaks,datatable,C#,.net,Ado.net,Memory Leaks,Datatable,下面的代码正在泄漏内存,即使数据库没有返回任何数据。谁能解释一下这件事。net探查器应用程序显示罪魁祸首是datatable using (OleDbDataAdapter da = new OleDbDataAdapter("select * from external_message where status='P' and pendingthread=" + Thread.CurrentThread.ManagedThreadId, conn)) {

下面的代码正在泄漏内存,即使数据库没有返回任何数据。谁能解释一下这件事。net探查器应用程序显示罪魁祸首是datatable

using (OleDbDataAdapter da = new OleDbDataAdapter("select * from external_message where status='P' and pendingthread=" + Thread.CurrentThread.ManagedThreadId, conn))
                {
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    if (dt.Rows.Count > 0)
                    {
                        DataRow dr = dt.Rows[0];
                        NotificationService.Logger.Write(Logger.RdvLogLevel.Debug, (uint)Thread.CurrentThread.ManagedThreadId, "GetInputs", "Received Message Id {0} Type {1}", dr["MessageId"].ToString(), dr.Field<string>("TargetType"));
                        return new DatabaseItem { connection = conn, dataRow = dr };
                    }
                    else
                    {
                        dt.Dispose();
                    }
                }
使用(OleDbDataAdapter da=new-OleDbDataAdapter(“从外部_消息中选择*,其中status='P'和pendingthread=“+Thread.CurrentThread.ManagedThreadId,conn))
{
DataTable dt=新的DataTable();
da.填充(dt);
如果(dt.Rows.Count>0)
{
数据行dr=dt.行[0];
NotificationService.Logger.Write(Logger.RdvLogLevel.Debug,(uint)Thread.CurrentThread.ManagedThreadId,“GetInputs”,“接收到的消息Id{0}类型{1}”,dr[“MessageId”].ToString(),dr.Field(“TargetType”);
返回新的数据库项{connection=conn,dataRow=dr};
}
其他的
{
dt.Dispose();
}
}

行下可能会导致内存泄漏。您必须处理包含一些非托管数据的数据库连接

return new DatabaseItem { connection = conn, dataRow = dr };

如果即使没有返回任何数据,也会导致内存泄漏,请确保处理
conn
?您必须始终处理数据库连接。

我不认为这是泄漏。这些对象将消耗资源,直到它们被垃圾回收。您的dt.Dispose()将向垃圾收集器提示不再需要您的对象,但是.Net不会清理它,直到它感觉需要它为止


您可以通过调用GC.Collect()来提示垃圾回收器运行,但通常应该让.Net自行清理。

主函数上的[StatThread]导致了问题。删除了它,现在一切正常。

“即使数据库没有返回任何数据,也会泄漏内存。”@BrokenGlass:谢谢你指出这一点。可能是因为不调用conn.Dispose()连接在父方法中已关闭。我只是返回此连接以重用已打开的连接。@MubashirKhan:我不确定父方法中发生了什么。要记住的一点是,当您不需要连接时,必须处理它。关闭是不够的。DataTable正在泄漏内存,而不是连接。我在父方法中处理连接。我正在等待开始悬赏,并已向microsoft报告,以寻求帮助。我有一个.net profiler应用程序。无论何时调用gc,它都会显示数据。内存不断增长,根引用不断增加。如果我对上述代码进行注释,则不会发生这种情况。探查器显示,在datatable的协构造函数中初始化的ReaderWriterLock的终结器被卡住,gc队列中有许多此类对象从未被收集。您是否尝试过在da.Fill中填充数据集,然后获取生成的datatable?相同的代码在控制台应用程序中工作正常,但是泄露了windows服务的内存。请注意,此代码是在单独的线程中编写的