powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SmtpClient, проблема, вскипает мозк, помогите плиз
14 сообщений из 64, страница 3 из 3
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38685313
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за помощь.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38685318
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завёл два базовых класса - DisposableWithUnmanagedBase и DisposableWithoutUnmanagedBase. Во втором классе убрал метод DisposeUnmanagedResources, убрал финализатор и упростил DisposeManagedResources.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38689105
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79HomeCoderА ещё какая-то практика есть, чтобы после Dispose или просто, когда объект уже не нужен, назначать объектам null - это что, быстрее и вернее заставит сборщика мусора на самом деле освободить ресурсы, или это маразм и перестраховка сиплюсплюсников?
сборщик мусора он на то и сборщик, что работает сам. Стратегия работы сборщика может задаваться например в конфиге. Разумеется, можно вызвать и вручную GC.Collect, но это признак плохого тона.
Если реальный вызов сборщика неопределён, то тогда есть смысл в присваивании null, как я думаю. Ибо часто встречаются конструкции вида

Код: c#
1.
2.
3.
4.
if (obj != null)
{
    obj.Dispose();
}



Вот после вызова Dispose есть смысл поставить obj = null.

Потому что сразу после вызова Dispose сборщик может и не вызваться, зато может быть:

1) снова будет вызван код выше;
2) кто-то другой попытается вызвать объект obj.

И если в 1) спасает правильный шаблон Dispose, который должен быть спроектироват так, чтобы было безопасно вызывать Dispose много раз подряд, то в 2) что спасёт? Может же быть такая ситуация, что сборщик ещё только начал удалять obj (т. е. obj ещё не null), а кто-то пытается его использовать?

Я правильно рассуждаю?


Или объясните уже наконец, ПОЧЕМУ многие присваивают null объектам?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38689108
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HomeCoderИли объясните уже наконец, ПОЧЕМУ многие присваивают null объектам?
А особенно объектам, которые реализуют Dispose.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38689124
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomeCoderИ если в 1) спасает правильный шаблон Dispose, который должен быть спроектироват так, чтобы было безопасно вызывать Dispose много раз подряд, то в 2) что спасёт? Может же быть такая ситуация, что сборщик ещё только начал удалять obj (т. е. obj ещё не null), а кто-то пытается его использовать?

Я правильно рассуждаю?

Или объясните уже наконец, ПОЧЕМУ многие присваивают null объектам?

1) Null присваивают по разным причинам, и эти причины не всегда связаны с Dispose. Я вот отнюдь не всегда пишу null. Например,

var obj = new КакаяТоДиспозейблХрень();
try {
чего нить
} finally {
obj.Dispose()
}

Никакого присвоения null нет, obj далее не используется, когда его приберет сборщик мусора - мне неизвестно и совершенно неинтересно.

2) Если у вас несколько разных объектов пытаются вызывать Dispose у одного объекта, это неправильная архитектура (ИМХО). Всегда должно быть точно определено, кто создает объекты, и кто их уничтожает.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691341
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а если такая ситуация, что объекты используются часто, и где-то вызвался Dispose. Если сборщик сразу не освобождает память, то может быть попытка использования объекта, для которого уже вызван Dispose. К чему это может привести? Вот эта неопределённость мне и не нравится. В С++ ты сделал delete объекта по указателю, присвоил указателю null и всё это произошло сразу - нет никаких недомолвок, что де сборщик какой-то не сразу всё удалил или удалил лишь частично.

Меня просто нервирует это. Сначала декларируется, что не надо думать об освобождении памяти. Потом вводится понятие Dispose (и это без всяких unsafe - с unsafe всё ещё усложняется). А потом говорится, что даже после всех этих Dispose и ручного вызова GC.Collect не обязательно сразу ресурсы будут освобождены. Сборщик мусора ещё подумает. Вводится понятие поколений объектов в мусорной куче (хорошее название для "кучи", хе-хе). Потом говорится, что и правилу поколений сборщик не всегда следует - есть де случаи, когда и объекты, которые уже должны быть удалены, всё ещё живут. И вот при такой неопределённости предлагается писать приложения.

При такой неопределённости простое присвоение null выглядит простым и эффективным способом избавиться от этих костылей. У нас же уже есть шаблон if (obj != null). Для таких общепринятых проверок простое присвоение null может быть хорошей практикой и гарантией, что не будет использования объекта, для которого уже был вызван Dispose, но который ещё фактически не освободился. Или освободился не полностью.


Я думаю, тут загвоздка вот в чём. Нужно разделять управление памятью (предотващение утечек и пр.) и логику использования объектов в коде.

GC занимается управлением памятью - т. е. предотвращает утечки и снимает с программиста работу по ручному освобождению ресурсов. Но он не защищает от использования объектов, которые по логике уже освобождены, а по факту - нет. От этого защищает присвоение null.

Когда говорят, что присваивать null не нужно, имеют ввиду, что это не нужно делать для освобождения ресурсов . Но не для защиты от использования объектов, которые по логике (только по логике, но ещё не на самом деле) уже освобождены. Сборщик мусора может сработать сильно позже и "занулить", объект, а использование объекта может быть раньше этого "зануления". Поэтому, чтобы такого неправильного использования не произошло, надо присваивать null объекту, который больше не предпоплагается использовать. Это не освобождает ресурсы, а всего лишь сигнализирует программисту о том, что этот объект СЧИТАЕТСЯ ОСВОБОЖДЁННЫМ.


Как вы считаете?


Просто уже нервирует, когда видишь проект, в котором в порядке вещей куча подобных вот

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public void Shutdown()
{
    if (RasterState != null)
    {
        RasterState.Dispose();
        RasterState = null;
    }

    if (DepthStencilView != null)
    {
        DepthStencilView.Dispose();
        DepthStencilView = null;
    }

    if (DepthStencilState != null)
    {
        DepthStencilState.Dispose();
        DepthStencilState = null;
    }

    if (DepthStencilBuffer != null)
    {
        DepthStencilBuffer.Dispose();
        DepthStencilBuffer = null;
    }

    if (RenderTargetView != null)
    {
        RenderTargetView.Dispose();
        RenderTargetView = null;
    }

    if (Device != null)
    {
        Device.Dispose();
        Device = null;
    }

    if (SwapChain != null)
    {
        SwapChain.Dispose();
        SwapChain = null;
    }
}

...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691485
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomeCoderЕсли сборщик сразу не освобождает память, то может быть попытка использования объекта, для которого уже вызван Dispose
1) В том шаблоне, который я приводил, есть свойство IsDisposed. Поэтому смело можно вызывать хоть 10 Dispose подряд. Исполнится только первый. Проверка на null нужна только чтобы убедиться, что объект существует. К ресурсам, которые этот объект использует, null никак не относится.

2) Вы не понимаете концепции управляемой памяти. Dispose нужен для скорейшего освобождения ресурсов. Например, соединения с БД, или файла. Но не для удаления объекта. Сами объекты можно не удалять вообще - это работа GC. Я бы даже сказал, что это предпочтительный стиль кодирования - куча мелких (и желательно immutable) объектов. В этом случае GC работает очень эффективно. И отказываться от такого стиля нужно только в случае особых обстоятельств, например, проседания по производительности

3) Код пишите вы, вот и обеспечивайте ситуацию, когда таких попыток не будет. У меня же получается. Не вижу причин, чтобы это не получалось у вас. Почему у вас по коду должно быть разбросано много мест, где делают Dispose? Делайте в одном месте.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691600
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

я имел ввиду, что Dispose вызван, а объект продолжает кто-то вызывать. Не Dispose на объекте, а сам объект использовать - его методы, свойства и прочее. Т. е. ресурсы, которые использует этот объект, освобождены, а объект пытаются использовать с этими ресурсами. - Ошибка.

А если "занулить" объект, то и использовать нечего. - Хорошо.

А?

Может, стоить где-то в этот шаблон Dispose добавить зануление этого объекта? Типа this = null? Или что-то в этом роде.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691606
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, уже есть аналог - вместо null и проверки

if(obj != null)

надо использовать IsDisposed и проверку

if(obj.IsDisposed)

Правильно?

Только вот загвоздка - все знают шаблон проверки if(obj != null), а вот шбалон проверки if(obj.IsDisposed) не распространён. Надо запоминать, договариваться с коллегами, вводить правила, что для унаследованных от такого-то класса надо такие-то проверки делать. Потом в коде проверять, унаследован ли или нет... С null как-то более привычно и распространённо.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691645
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если HomeCoderDispose вызван, а объект продолжает кто-то вызывать, то это косяк архитектуры. И null здесь никак не поможет.
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691676
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79если HomeCoderDispose вызван, а объект продолжает кто-то вызывать, то это косяк архитектуры. И null здесь никак не поможет.
как и при обращении по висячей ссылке после удаления объекта в c++
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38691710
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomeCoder,
Dispose никакого отношения к уборке мусора не имеет, ну разве что запрет на вызов финализатора в классическом исполнении
Все ваши сепаратистские высказывания в стиле обращение к отдиспозеному объекту сводятся к простому -
обращение к объекту состояние которого программист изменил по незнанке и где реальный результат отличается от ожидаемого.
типа cm.CommandText=""; ну что тут ответить......... наверно имя - насрано...
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38692371
HomeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда как вы можете прокомментировать постоынне заналливания после Dispose в примере кода , что я привёл?

Там автор писал, что он недостаточно опытен в С#. Более того, код был портирован с С++, где автор кода был более опытен. Можно это посчитать за старую привычку сиплюсплюсника?
...
Рейтинг: 0 / 0
SmtpClient, проблема, вскипает мозк, помогите плиз
    #38692394
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomeCoder,

от очистки ссылок польза есть - если по каким либо причинам объект, метод shutdown которого демострируется в примере, не удалится мусоросборщиком (ссылку кто либо удержит) - хвосты освободятся
...
Рейтинг: 0 / 0
14 сообщений из 64, страница 3 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SmtpClient, проблема, вскипает мозк, помогите плиз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]