Утечка памяти в DataTable - PullRequest
       20

Утечка памяти в DataTable

3 голосов
/ 05 октября 2011

следующий фрагмент кода вызывает утечку памяти, даже если база данных не возвращает никаких данных. Кто-нибудь может пролить свет на это. Приложение .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();
                    }
                }

Ответы [ 3 ]

4 голосов
/ 05 октября 2011

Возможно, ниже строки причиной утечки памяти. Вы должны утилизировать соединения с базой данных, которые содержат некоторые неуправляемые данные.

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

Если утечка памяти, даже если данные не возвращаются, убедитесь, что вы утилизировали conn? Всегда вы должны располагать подключениями к базе данных.

0 голосов
/ 07 октября 2011

[STAThread] в главной функции вызывало проблему. Убрал его и теперь все работает нормально.

0 голосов
/ 05 октября 2011

Я не думаю, что это утечка.Такие объекты будут потреблять ресурсы, пока они не будут собраны мусором.Ваш dt.Dispose () предоставит сборщику мусора подсказку о том, что ваш объект больше не нужен, но .Net не будет его очищать, пока не почувствуете, что это так.

Вы можете предложить запустить сборщик мусора, вызвав GC.Collect (), но обычно вы должны позволить .Net очиститься после себя.

...