Правильное закрытие приложения и очищение объектов .Net

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Правильное закрытие приложения и очищение объектов .Net

Сообщение AlekseyVB » 02.03.2010 (Вт) 12:57

Доброго времени суток!

Нужно ли для всех объектов, имеющих методы .Clear() .Close() .Dispose(), вызывать соответствующие методы по окончании их использования? И нужно ли писать для всех объектов = Nothing? И если нужно почему? Неужели они не очищаются сами по себе после закрытия программы?

Я решил все такие методы запихать в процедуру в модуле. При закрытие формы(нажатие на крестик) или нажатие на кнопку Exit (что вызывает метод frmMain.Dispose) выполняется процедура, например:
Код: Выделить всё
[b]Module[/b]   
    Public SQLiteCon As New SQLiteConnection
    Public Command As New SQLiteCommand
    Public DS As New DataSet
    Public DA As New SQLiteDataAdapter
    Public DR As SQLiteDataReader
    Public Builder As New SQLiteCommandBuilder(DA)
    Public CM As CurrencyManager

Public Sub subExitAndCloseConnection()
        Command = Nothing
        DS.Clear()
        DS = Nothing
        DA = Nothing
        DR = Nothing
        Builder = Nothing
        CM = Nothing
        SQLiteCon.Close()
        SQLiteCon.Dispose()
        frmMain = Nothing
        Beep()
End Sub
[b]frmMain[/b]
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Dispose()
End Sub
Private Sub frmMain_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        subExitAndCloseConnection()
End Sub


Вообщем имеет ли смысл очищать все объекты таким образом?
Последний раз редактировалось AlekseyVB 02.03.2010 (Вт) 16:56, всего редактировалось 1 раз.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очещение объектов .Net

Сообщение Денис » 02.03.2010 (Вт) 13:37

Если ошибаюсь, поправьте: Деструкторы были изобретены для программ, которые работают долго. И в течении своей долгой работы создают много объектов. Так вот, если не уничтожать созданные, но неиспользуемые объекты, а продолжать создавать новые, то мы получаем так называемые утечки памяти.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Правильное закрытие приложения и очещение объектов .Net

Сообщение Antonariy » 02.03.2010 (Вт) 15:35

Лучший способ понять что-то самому — объяснить это другому.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очещение объектов .Net

Сообщение Twister » 02.03.2010 (Вт) 16:26

Неужели они не очищаются сами по себе после закрытия программы?
Ну Antonariy уже ответил, там есть сборщик мусора. Вот они, прелести .NET! :lol:

А по поводу процитированного мной вашего вопроса: после завершения процесса система сама вычистит всю память, занятую какими-либо объектами, будь то .NET-грязь или выделенные вами кучи. Вот они, прелести Винды ;)
А я все практикую лечение травами...

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение AlekseyVB » 03.03.2010 (Ср) 19:43

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Хакер » 03.03.2010 (Ср) 19:46

Не но.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение MIT » 03.03.2010 (Ср) 20:01

AlekseyVB писал(а):Например, если из приложения открыть файл excel, после завершения основного приложения excel сам по себе не закроется.
Это означает только то, что ты не умеешь пользоваться Экселем из-под дотнета. Ни более того.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 10:21

Это означает только то, что ты не умеешь пользоваться Экселем из-под дотнета. Ни более того.
Правильно ли я понял? Это намек на то, что если через .NET (каким-то там хитромудрым способом) запустить Excel, а потом убить .NET-процесс с помощью NtTerminateProcess, то Excel тоже завершится? Ну-ну.
А я все практикую лечение травами...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение MIT » 04.03.2010 (Чт) 10:26

Неправильно. Если из под дотнета хитромудрым способом запустить Эксель, то дотнет-приложение ничуть не менее хитромудрым способом должно и завершить процесс Экселя, иначе после завершения дотнетного процесса он так и останется болтаться в памяти.

Добавлено:
Это намёк на то, что ТС знает хитромудрый способ запуска, но не знает хитромудрого способа завершения Экселя.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Денис » 04.03.2010 (Чт) 10:31

C появлением дотнета никто не отменял потоки, процессы и дерево процесса (термин из диспетчера задач руссифицированной винды). Такие дела.

Итак. При "правильном" открытии процесса экселя вашим процессом, формируется дерево, в котором ваш процесс - корень, а excel - лист первого уровня.
При "правильном" "убиении" вашего процесса, завершаются все ветви дерева вашего процесса, а затем, завершается ваш процесс.

Вопрос. Причем здесь дотнет и (не-)/правильная работа с ним?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 10:32

При "правильном" "убиении" вашего процесса, завершаются все ветви дерева вашего процесса, а затем, завершается ваш процесс.
Бред. Что есть по твоему правильное убиение?
А я все практикую лечение травами...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Денис » 04.03.2010 (Чт) 10:45

Twister писал(а):Бред.

Ну так и я о том же.
Twister писал(а):Что есть по твоему правильное убиение?

Что-то, что обсуждается выше. И обратите внимание на кавычки у меня.

Я же полагаю, что при следовании парадигме ООП (безотносительно рабочей среды), даже процесс - это, в первую очередь, объект. А значит, мне необходимо и достаточно вызвать деструктор для него (.Dispose или т.п.) и забыть о нем. Среда сама должна выполнить все необходимые действия (завершить процессы, закрыть файлы, ссылки, флаги, освободить память, и т.п.)

А сборщики мусора - это пятое колесо для нерадивых быдлокодеров. Первое правило, что должен знать программист: Создал? Поработал? Уничтожь.

Я неправ?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 10:54

Ты не прав говоря о дереве объектов. Именно это я назвал бредом. Нет и небыло в винде такого понятия. Есть в структуре EPROCESS поле, содержащее PID родителя и не более. Поле это никак не влияет на работу системы и является сугубо информативным. При убиении родителя поле это не обновляется. Проведи эксперимент - с помощью ProcessExplorer'а убей проводник. Ты увидишь, что все порожденные им процессы остались.
Функция же "Kill Process Tree" в этой же программе вручную обходит всех потомков и поочередно прибивает каждого.
А я все практикую лечение травами...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Денис » 04.03.2010 (Чт) 11:01

Twister писал(а):


Я все это знаю и об этом же и говорил. Хватит спорить на пустом месте.

Единственное, что добавлю, функция обходит не только потомков, а рекурсивно потомков с их потомками и поочередно прибивает всех.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 11:10

Эм... Денис. Похоже мы говорим о разных уронях: ты о дереве в .NET, я о дереве в системе. Так?
А я все практикую лечение травами...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение MIT » 04.03.2010 (Чт) 11:13

Twister
А как быть с деревом процессов, которое создает Гуглехром или ИЕ8? Там есть один основной процесс и куча дочерних, обозначаемых как Job по терминологии Process Explorer`а, по завершении которого убиваются всё дерево. Каким образом это реализовано?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 11:16

Каким образом это реализовано?
Ну ты же сам и ответил на вопрос. Есть в винде такие объекты, зовутся JOB_OBJECT. С помощью этих объектов можно объединить несколько процессов и "централизовано" ими управлять. Туда могут входить не только потомки, но и сторонние процессы (поэтому, опять же, о дереве как таковом речи идти не может). Одно но: при порождении дочерних процессов никакой работы с Job-объектами не происходит, надо все делать руками.
А я все практикую лечение травами...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Денис » 04.03.2010 (Чт) 11:23

Twister писал(а):Эм... Денис. Похоже мы говорим о разных уронях: ты о дереве в .NET, я о дереве в системе. Так?


Я говорил о дереве, как об программной абстракции. Как об алгоритме. Безотносительно нюансов реализации.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 11:29

Безотносительно нюансов реализации

Но тут-то как-раз вся соль именно в реализации. Иначе каков предмет дискуссии? Мы же тут выясняем каким образом процессы-потомки будут реагировать на смерть процесса-родителя и как на эту реакцию влияют те или иные механизмы.
А я все практикую лечение травами...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение MIT » 04.03.2010 (Чт) 11:31

Twister писал(а):Туда могут входить не только потомки, но и сторонние процессы
Значит можно любой процесс сделать своим JOB_OBJECT`ом и он будет автоматически завершен по завершении главного?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Antonariy » 04.03.2010 (Чт) 11:47

MIT писал(а):
Twister писал(а):Туда могут входить не только потомки, но и сторонние процессы
Значит можно любой процесс сделать своим JOB_OBJECT`ом и он будет автоматически завершен по завершении главного?

Twister писал(а):Одно но: при порождении дочерних процессов никакой работы с Job-объектами не происходит, надо все делать руками.
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Денис » 04.03.2010 (Чт) 11:59

Twister писал(а):Мы же тут выясняем каким образом процессы-потомки будут реагировать на смерть процесса-родителя и как на эту реакцию влияют те или иные механизмы.


Значит, однозначно никак. Ибо система так себя ведет.
Twister писал(а):Проведи эксперимент - с помощью ProcessExplorer'а убей проводник. Ты увидишь, что все порожденные им процессы остались.


Если же вернуться к проблеме с которой мы начали обсуждение: "Правильной" работе с процессом Excel в среде .Net, то тут нужно провести полевые испытания: в каких случаях приложение закрывает себя корректно (и закрывает порожденные собой процессы)
Руками. Руками.

Либо оно (приложение) жестко закрывает свой процесс, оставляя после себя гору мусора.

Я думаю, для многих станет очевидным, что нет какого-то мифического правильного дотнет-вея, согласно которому Excel открывается и закрывается "правильно"; а была и есть парадигма ООП, согласно которой созданный явно объект необходимо явно уничтожить.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Правильное закрытие приложения и очищение объектов .Net

Сообщение Twister » 04.03.2010 (Чт) 12:01

Значит можно любой процесс сделать своим JOB_OBJECT`ом и он будет автоматически завершен по завершении главного?

Немного не так.

Создается JobObject. Это, по-сути, просто список процессов. В него добавляются процессы. И потом, манипулируя этим объектом, мы манипулируем сразу всеми процессами в списке, получать по ним информацию. Эффект убиения всех процессов достигается следующим образом:

Создаем Job (CreateJobObject)
Добавляем процессы (AssignProcessToJobObject)
Выставляем LimitFlags в структуре JOBOBJECT_BASIC_LIMIT_INFORMATION в JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE и вызываем SetInformationJobObject.

Естественно, что хэндл Job'а есть только у нас (не всегда, конечно, можно и разрешить дочкам наследовать наши хэндлы). Следовательно - при убиении нашего процесса умрут и остальные.

Здесь все написано: http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
А я все практикую лечение травами...


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

    TopList