Как разместить DataTable в asp.net перед сборкой мусора GC? - PullRequest
1 голос
/ 25 октября 2011

Мое приложение работает 24X7, и я использую DataTable для обработки данных.

Мне нужно распоряжаться DataTable каждый раз.Я использовал методы Dispose и Clear, но содержимое только очищается, и его экземпляр все еще находится в памяти, когда я отлаживаю код.

Как я могу удалить его из памяти вне зависимости от GC?

Заранее спасибо ..

РЕДАКТИРОВАТЬ: Это мой прототип кода.я сделал это двумя способами.

 1     //Methord 1
 2               while (true)
 3               {
 4                   DataTable dt = new DataTable();
 5                   dt.Columns.Add("City", typeof(string));
 6                   dt.Rows.Add("ABC");
 7                   dt.Rows.Add("XYZ");
 8                   dt.Rows.Add("PQR");
 9                   dt.Rows.Add("LMN");
 10                   dt.Dispose();
 11               }
 12    //Methord 2
 13               while (true)
 14               {
 15                   using (DataTable dtable = new DataTable())
 16                   {
 17                       dtable.Columns.Add("City", typeof(string));
 18                       dtable.Rows.Add("ABC");
 19                       dtable.Rows.Add("XYZ");
 20                       dtable.Rows.Add("PQR");
 21                       dtable.Rows.Add("LMN");
 22                   }
 23               }

как данные удаляются?если вы проверяете с точкой останова, вы можете видеть, что datatable 'dt' все еще имеет значения даже после вызова dispose (). даже при выполнении строки № 11 значения все еще там. Мне нужно освободить эту память перед выполнением строки 12 (или до2-я итерация пока).что мне здесь делать?

Ответы [ 5 ]

2 голосов
/ 25 октября 2011

Если вы установите для каждой ссылки на данные ничего / ноль, базовые данные могут быть собраны сборщиком мусора.Когда объект теряется, среда dotnet автоматически собирает мусор, когда считает, что это уместно.

Вы можете указать сборщику мусора вручную, но он будет собирать только объекты, на которые нет ссылок.код.http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

Сводка о том, как работает Dotnet GC.http://dotnetfacts.blogspot.com/2008/05/how-garbage-collector-works-part-1.html

Если сборщик мусора не освобождает память, возможно, это связано с тем, что другие объекты, элементы управления пользовательского интерфейса / другие бизнес-объекты, которые вы могли написать, имеют ссылки на данные строк в вашей таблице данных.Например, вы отображаете данные строки или передали строку в другой объект, и у него есть ссылка на эту строку.

Если у вас постоянно увеличивается объем памяти, у вас есть утечка памяти, т. Е.все большее число объектов, которые имеют ссылки на них, и фреймворк не может собирать эти данные, поскольку считает, что они используются.Вам нужно будет посмотреть на свой код и попытаться выяснить, почему он протекает, может помочь профилировщик памяти.

1 голос
/ 25 октября 2011

Я сомневаюсь, что это хороший дизайн, чтобы попытаться пересмотреть то, что GC делает в любом случае. Почему бы вам просто не запустить задачу цикла, которая запускается 24/7, которая просто запускает процесс как новый поток? Когда поток завершен, вы можете уничтожить его, и в результате у вас не будет проблем с памятью.

1 голос
/ 25 октября 2011

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

. Вы должны просто убедиться, что не сохраняете никаких ссылок на DataTable, когда он больше не нужен.Если вы выполнили эту часть правильно, т. Е. Нет ссылки на DataTable, если это не требуется, тогда вы в порядке и оставляете GC

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

Вместо вызова метода dispose, вы всегда можете заключить саму таблицу данных в блок использования:

using (DataTable dt = new DataTable())
{
   //Do work here
}

Это обеспечит его очистку, когда сам объект выходит за пределы своей области видимости.

Статья MSDN сама по себе является очевидным ресурсом, если вы никогда не использовали ее ранее, но идея очень проста.

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

Сборщик мусора потребуется для его полной утилизации, но если он вам больше не нужен, вы всегда можете установить его на ноль.

//do some stuff with the table

//don't need it any longer so set it null
table = null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...