Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Дали работу над старым приложением. Это сервис. Работает круглосуточно, ночью перезагружается вместе с машиной. Грузит в себя данные, формирует из них очередь, суёт переданные издалека созданные и сконфигурированные SqlCommand инстанции в поле Command каждого объекта в очереди, выполняет их и очищает очередь.
Естественно, команды в таком дизайне не завёрнуты в using(). После очистки очереди они, как я понимаю, магически не освободят неуправляемые ресурсы.
Достаточно ли просто вызвать на каждую из них QueueItemInstance.Command.Dispose() в try/catch блоке и проглотить исключение если его что-то бросит, или тут нужно что-то другое, типа имплементировать IDisposable на QueueItem - объекте из которых формируется очередь и т д и т п?

Премного благодарен!
28 апр 21, 15:45    [22315714]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Да, вот еще: обработка очереди происходит, естественно, в foreach(), так что даже если я буду звать QueueItemInstance.Dispose(), то не смогу QueueItemInstance = null, поэтому сомневаюсь в целесообразности имплементации IDisposable на QueueItem.
28 апр 21, 16:17    [22315736]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Bold Stump,
У вас есть подозрение, что не правильно релизованы финализаторы у инструментов?
Имхо параноя, если все работает годами и не падает, не стоит туда соваться.
28 апр 21, 16:52    [22315768]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Где-то в степи
Bold Stump,
У вас есть подозрение, что не правильно релизованы финализаторы у инструментов?
Имхо параноя, если все работает годами и не падает, не стоит туда соваться.


Нет, ничего подобного! Просто в очередь суётся некий класс, своя моделька, в котором есть поле

SqlCommand Command.

Прошлись foreach() по очереди, для каждого элемента сделали QueueItemInstance.Command.ExecuteNonQuery() и после цикла вызвали queue.Clear()

Естественно, моделькам будет вызван деструктор, но класс модельки QueueItem не дитё IDisposable и не развополщает эту Command, следовательно на неё не будет вызван Dispose().

Понятно объясняю?
28 апр 21, 17:25    [22315788]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
Bold Stump,

Почитайте у Рихтера про имплементацию IDisposable в сочетании с финализатором.
28 апр 21, 17:30    [22315793]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Bold Stump,
Там защита от дурака должна быть ( образно) вдруг разраб забыл using поставить, тихо мирно умрет..
слушайте Сон Веры Павловны он плохого не посоветует...

Сообщение было отредактировано: 28 апр 21, 17:30
28 апр 21, 17:38    [22315802]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Сон Веры Павловны
Bold Stump,

Почитайте у Рихтера про имплементацию IDisposable в сочетании с финализатором.


Зачем мне читать какого-то Рихтера, когда все детали имплементации есть в MSDN?
Я не спрашиваю, как это имплементировать. Я прошу совета, можно ли просто вызвать Dispose на саму инстанцию SqlConnection, потому что самому мне никогда не приходилось это делать: я не посылаю команды в пеше путешествие через всё приложение, а создаю их в using() где и когда мне нужно.

Я не хочу перелопачивать всё их приложение, поэтому ищу ответа на ранее поставленный вопрос, а зачитываться книжками мне некогда. Не надо отсылать к книжкам по поводу тривиальных вопросов - это никому не помогает. Ситуация специфическая, потому что изначальный разраб был нубом (и остался, по правде говоря), и врядли она когда-нибудь для меня повторится, а становиться знатоком внутренностей .NET мне заработать на жизнь не поможет.
28 апр 21, 17:39    [22315805]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Где-то в степи
Bold Stump,
Там защита от дурака должна быть ( образно) вдруг разраб забыл using поставить, тихо мирно умрет..
слушайте Сон Веры Павловны он плохого не посоветует...


Где гарантия? MS не зря сделали SqlCommand имплементирующим IDisposable. На это у них была какая-то причина, и не доверять им у меня нет никаких оснований. Значит, защиты от дурака они не предусмотрели. Что-то должно утекать, если не развоплощать SqlCommand как следует. Не знаю что и не хочу знать, но раз он IDisposable, то уничтожить объект нужно.

Сообщение было отредактировано: 28 апр 21, 17:37
28 апр 21, 17:42    [22315807]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Bold Stump,
да забейте, все ведь работает - all die
вот прикиньте, сделаете подтиралку за собой, чето сбойнет, вы крайний, лишат премии, обьявят выговор, порицание,
поставят на вид, от вас уйдет близкий человек - как от неумехи, ваша кошка будет призирать вас за туфотовый код, дерпессия, смена работы, запой, клошаринг, бачки, теплотрасса - и все за ... using, оно вам надо?

Сообщение было отредактировано: 28 апр 21, 18:10
28 апр 21, 18:11    [22315824]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Где-то в степи
Bold Stump,
да забейте, все ведь работает - all die


убедившись, что ответа не добиться, уже заменил передачу по эстафете команды на её текст. и Вы забейте!
28 апр 21, 18:19    [22315837]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Bold Stump
Member

Откуда: Дубгород
Сообщений: 8
Где-то в степи
Bold Stump,
да забейте, все ведь работает - all die
вот прикиньте, сделаете подтиралку за собой, чето сбойнет, вы крайний, лишат премии, обьявят выговор, порицание,
поставят на вид, от вас уйдет близкий человек - как от неумехи, ваша кошка будет призирать вас за туфотовый код,
дерпессия, смена работы, запой, клошаринг, бачки, теплотрасса - и все за ... using, оно вам надо?


а потом все удивляются короне
28 апр 21, 18:33    [22315850]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Bold Stump,
вообще что мешает поставить обыкновенный using, там надо с try cath - если есть разобраться и с системой отката трансакции если есть, что бы не вызвать rollback на закомиченную трансакцию, а то что грохнется в usinge забейте, там компилятор в секции final всеравно будет тупо диспозить, что ж такие вещи то нафорум тащить?
28 апр 21, 18:39    [22315856]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Bold Stump
а потом все удивляются короне

гыгы конец рабочего европейского дня:
Мы писали.
Мы писали.
Наши пальчики устали. ( назидательно так)
Мы немножко попиз...ём.
И опять писать начнём ( уверенно и весело так)
28 апр 21, 18:45    [22315868]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Архитектура огонь.
28 апр 21, 19:03    [22315889]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
hVostt
Member

Откуда:
Сообщений: 19318
fkthat
Архитектура огонь.


Вот это я понемаю файловер )
28 апр 21, 22:43    [22316014]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Bold Stump
убедившись, что ответа не добиться, уже заменил передачу по эстафете команды на её текст. и Вы забейте!

Слава Ктулху, что дошло, что такие объекты, как SqlCommand или SqlConnection просто не предназначены для того, чтобы положить их куда-то на неделю, а потом достать и использовать.
28 апр 21, 23:55    [22316041]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
Bold Stump
Зачем мне читать какого-то Рихтера, когда все детали имплементации есть в MSDN?

Ну раз вы так хорошо знаете MSDN, то как получилось пройти мимо этого?
The using statement ensures that Dispose (or DisposeAsync) is called even if an exception occurs within the using block. You can achieve the same result by putting the object inside a try block and then calling Dispose (or DisposeAsync) in a finally block; in fact, this is how the using statement is translated by the compiler.

Bold Stump
Не надо отсылать к книжкам по поводу тривиальных вопросов - это никому не помогает.

Ага, знакомая картина - думать некогда, пилить надо. Есть предположение, что изначальный разраб, который был нубом, был им примерно по той же причине.
29 апр 21, 06:50    [22316090]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
winsky!
Member

Откуда: Київ
Сообщений: 5143
Bold Stump

Зачем мне читать какого-то Рихтера

действительно
29 апр 21, 09:21    [22316130]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Bold Stump
MS не зря сделали SqlCommand имплементирующим IDisposable. На это у них была какая-то причина

Вообще-то есть исключения. Например, HttpClient или Task, но это результат либо легаси, либо изначальной ошибки дизайна - в MS тоже люди работают.
29 апр 21, 10:41    [22316174]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4155
Bold Stump
Сон Веры Павловны
Bold Stump,

Почитайте у Рихтера про имплементацию IDisposable в сочетании с финализатором.


Зачем мне читать какого-то Рихтера
...а становиться знатоком внутренностей .NET мне заработать на жизнь не поможет.


Не останавливайтесь!
29 апр 21, 12:40    [22316259]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Ролг Хупин
Не останавливайтесь!

Возможно, чел зарабатывает 7-8 К в месяц на nodejs или react, а тут его таском на дотнете нагрузили.
29 апр 21, 12:52    [22316279]     Ответить | Цитировать Сообщить модератору
 Re: Правильно развоплотить объект, имплементирующий IDisposable, но не завёрнутый в using()  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
Бывал я в Чебаркуле, природа озера, ляпота....
29 апр 21, 12:54    [22316280]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить