即使数据库没有返回数据,下面的代码也会泄漏内存。任何人都可以对此有所了解。 .net profiler应用程序显示罪魁祸首是数据表
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();
}
}
答案 0 :(得分:4)
可能在线下导致内存泄漏。您必须处理包含一些非托管数据的数据库连接。
return new DatabaseItem { connection = conn, dataRow = dr };
如果即使没有数据返回也会泄漏内存,请确保弃置conn
?总是你必须处理数据库连接。
答案 1 :(得分:0)
我不认为这是泄密。这些对象将消耗资源,直到它们被垃圾收集。你的dt.Dispose()将向垃圾收集器提供一个提示,告知你不再需要你的对象,但.Net不会清理它直到感觉就好了。
您可以通过调用GC.Collect()来提示垃圾收集器运行,但通常您应该让.Net自行清理。
答案 2 :(得分:0)
[STAThread]导致问题。删除它,现在一切正常。