Re[4]: WPF. Финализаторы не вызываются. Утечка памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.06.20 09:14
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, igor-booch, Вы писали:


IB>>Финализатор с отпиской слабого хендлера от события как советуют здесь (Решение 3: Отписка от события в финализаторе)


НС>Мой тебе совет — не стоит использовать хабр как источник технической информации.


Ну там описывается как отписаться от события, если на объект нет ссылок. Помню и на этом форуме про этот подход писали.
У меня в свое время была проблема с отпиской от нетовских объектов из браузера, так как в JavaScript нет финализаторов.
Кстати посмотрел на блазор
https://stackoverflow.com/questions/61683382/jsruntime-in-blazor-webassembly-blocking-dom-updates-on-first-load
Там можно инжектить

 @implements IDisposable


и вызвать отписку
public void Dispose()
{
    MessageService.Notify -= OnNotify;
}
и солнце б утром не вставало, когда бы не было меня
Re[18]: WPF. Финализаторы не вызываются. Утечка памяти
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.06.20 11:45
Оценка:
Здравствуйте, igor-booch, Вы писали:

S>>Но не всегда можно вызвать Dispose, а освободить ресурсы необходимо.

IB>Приведите пример, когда нельзя вызвать Dispose
Эмм, ну вот например как-то так:
var myFile = File.OpenWrite("C:\temp\0asdask12.txt");
Thread.Create(o=>myFile.Write(Encoding.UTF-8.GetBytes(o.ToString())).Start(myBigObject);

Где вы тут будете звать Dispose()?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: WPF. Финализаторы не вызываются. Утечка памяти
От: igor-booch Россия  
Дата: 18.06.20 12:01
Оценка: :)
IB>>Приведите пример, когда нельзя вызвать Dispose
S>Эмм, ну вот например как-то так:
S>
S>var myFile = File.OpenWrite("C:\temp\0asdask12.txt");
S>Thread.Create(o=>myFile.Write(Encoding.UTF-8.GetBytes(o.ToString())).Start(myBigObject);
S>

S>Где вы тут будете звать Dispose()?

var myFile = File.OpenWrite("C:\temp\0asdask12.txt");
Thread.Create(o=>
{
    try     { myFile.Write(Encoding.UTF-8.GetBytes(o.ToString()); }
    finally { myFile.Dispose(); }
}).Start(myBigObject);
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 18.06.2020 12:01 igor-booch . Предыдущая версия .
Re: WPF. Финализаторы не вызываются. Утечка памяти
От: HotDog Швейцария www.denebspace.com
Дата: 19.06.20 07:38
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Условия воспроизведения:

IB>1) Visual Studio 2017
IB>2) Приложение WPF
IB>3) Запуск приложение под отладчиком
IB>4) код окна WPF

IB>Этот код отваливается с OutOfMemoryException. Финализаторы Item() не вызываются.


Зпустил под VS2019 все работает нормально, память не растет.
Re[20]: WPF. Финализаторы не вызываются. Утечка памяти
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.06.20 08:43
Оценка:
Здравствуйте, igor-booch, Вы писали:

Открою тебе секрет зачем был придуман GС.
В С++ вручную овобождают память в куче (там есть и подсчет ссылок, и shared_ptr). Но не всегда это возможно. В COM применяли подсчет ссылок, но были циклические ссылки которые не разруливались.
Объектом могут владеть множество других объектов, и нужно освобождать ресурсы когда ссылок на них нет.
и солнце б утром не вставало, когда бы не было меня
Re[2]: WPF. Финализаторы не вызываются. Утечка памяти
От: igor-booch Россия  
Дата: 19.06.20 17:49
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Здравствуйте, igor-booch, Вы писали:


IB>>Условия воспроизведения:

IB>>1) Visual Studio 2017
IB>>2) Приложение WPF
IB>>3) Запуск приложение под отладчиком
IB>>4) код окна WPF

IB>>Этот код отваливается с OutOfMemoryException. Финализаторы Item() не вызываются.


HD>Зпустил под VS2019 все работает нормально, память не растет.

У меня в 2019 тоже раблтает
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.