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
Re[8]: WPF. Финализаторы не вызываются. Утечка памяти
От: pilgrim_ Россия  
Дата: 18.06.25 09:59
Оценка: 36 (3) -1
Здравствуйте, _NN_, Вы писали:

_>>Тем не менее в спецификации C# деструкторы есть : https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#destructors


_NN>Ага. Повбивав би

_NN>Дать название из C++, а поведение совсем не такое как у деструкторов из C++:

Починили

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#1513-finalizers

Note: In an earlier version of this specification, what is now referred to as a “finalizer” was called a “destructor”. Experience has shown that the term “destructor” caused confusion and often resulted to incorrect expectations, especially to programmers knowing C++. In C++, a destructor is called in a determinate manner, whereas, in C#, a finalizer is not. To get determinate behavior from C#, one should use Dispose. end note

_NN>И ещё масла в огонь
_NN>

Finalizers (which are also called destructors)

_NN>https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/destructors

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/finalizers

Finalizers (historically referred to as destructors)




ps: сори за некропостинг, вспомнил по случаю
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.