Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с памятью 
:(
    Опции темы
Darkmaster
Дата 7.9.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Возникла небольшая проблемка с память, в моей СУБД. Проблема в том что есть dataGridView привязанный к dataTable, есть момент где нужно отключиться от данного dataTable, присвоив свойству dataGridView.DataSource = null потом мы снова присваиваем таблицу:

 
Код

 dataGridView1.DataMember = null;
            dataGridView1.DataSource = null;
           
            foreach (DataRow dr in dataTable1.Rows)
            {
                if (dr["fullname"].ToString().ToUpper().Contains(request) || dr["company"].ToString().ToUpper().Contains(request) || dr["email"].ToString().ToUpper().Contains(request) ||
                    dr["telephone"].ToString().ToUpper().Contains(request) || dr["country"].ToString().ToUpper().Contains(request) || dr["sex"].ToString().ToUpper().Contains(request) ||
                    dr["other"].ToString().ToUpper().Contains(request) || dr["vip"].ToString().ToUpper().Contains(request))
                    dataGridView1.Rows.Add(new object[] { dr["key"], dr["fullname"], dr["company"], dr["email"], dr["telephone"],
                    dr["country"], dr["sex"], dr["other"], dr["vip"] });
            }
            if (comboBox1.Text == "")
            {

                dataGridView1.DataSource = dataTable1;
            }


проблема в том что после того как мы венули гриду таблицу приложение занимает больше ОЗУ если выполнить данную процедуру несколько то память увеличиться еще. Не могу понять почему, ведь я просто отсеодиняю от грида таблицу ничего не удаляя и присоединяю ее же...
--------------------
GeekTV - интернет-телевидение для гиков
PM MAIL   Вверх
zaver
Дата 7.9.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



попробуй перед тем, как делаешь dataGridView1.DataSource = null; очистить DataSource вручную - просто удали все dataGridView1.Rows.Clear(). а если это не получится, то вызывай принудительно сборщик мусора
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Darkmaster
Дата 8.9.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



пробовал собиратать мусор при помощи 

 
Код

GC.Collect();
 GC.WaitForPendingFinalizers();


Вставлял и перед datasource и после а также после того как возвращаем таблицу в DataSource. Ну скажем так небольшой результат есть но не очень, реально помогает если создать кнопку которая собирает мусор и после моей функции вызвать ее несколько раз. В чем же дело?
--------------------
GeekTV - интернет-телевидение для гиков
PM MAIL   Вверх
zaver
Дата 8.9.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



в том что ты не там вызваеш сборщик мусора, если с кнопкой работает, а без нее не очень. 
PM MAIL WWW ICQ Skype YIM MSN   Вверх
tol05
Дата 8.9.2007, 22:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(Darkmaster @  7.9.2007,  15:02 Найти цитируемый пост)
Не могу понять почему, ведь я просто отсеодиняю от грида таблицу ничего не удаляя и присоединяю ее же...

достаточно открыть рефлектором свойство DataGridView.DataSource и пройтись по стеку вызовов. И можно увидеть, что биндинг даже одних и тех же данных к контролу требует (каждый раз!) создания множества временных объектов (хотя бы тех же DataGridViewRow's и DataGridViewColumn's), чтения атрибутов и т.д. и т.п. Еще лучше поюзать профайлер, например CLRProfiler...
Я думаю, что описывать подробности, что, сколько и когда создается - не нужно. Просто Darkmaster, поверь, что память расходуется и неплохо smile

Цитата(Darkmaster @  8.9.2007,  17:56 Найти цитируемый пост)
реально помогает если создать кнопку которая собирает мусор и после моей функции вызвать ее несколько раз. В чем же дело?

Все просто. В общих словах так:
Есть объекты, которые поддерживают финализацию, например объекты строк и стобцов самого грида, они же создаются при каждом биндинге, а когда ты null присваиваешь - уничтожаются. Так вот, они реально удаляются при втором (а не первом!) сборе мусора. При первом сборе отрабатывает финализатор и все... Поэтому кое-где модно использовать такое код:
Код

//уничтожатся объекты, не поддерживающие финализацию и 
//отработают финализаторы у объектов, поддерживающих финализацию
GC.Collect(); 
//Ждем пока все финализаторы закончат свою работу
GC.WaitForPendingFinalizers ()
//уничтожатся все объекты, не удаленные ранее
GC.Collect();

всем советую...

P.S. Darkmaster, не углядел твой код сбора мусора smile Но все равно - второй сбор нужен. Для объектов с отработанными финализаторами, но не удаленных...

Это сообщение отредактировал(а) tol05 - 8.9.2007, 22:17


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
zaver
Дата 8.9.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



хороший совет
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Darkmaster
Дата 10.9.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Спасибо большое! Очень помогло + новые знания щас буду углубляться в эту тему....
--------------------
GeekTV - интернет-телевидение для гиков
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.