Что такое Ваш “Предостерегающийся” список относительно предотвращения утечек памяти, когда Вы пишете код.NET?

РЕШЕНИЕ:

1) Добавьте этот nuget в свой проект: https://www.nuget.org/packages/PdfiumViewer/ (если это не так. не работает, добавьте это тоже: https://www.nuget.org/packages/PdfiumViewer.Native.x86_64.v8-xfa/ )

2) Добавить ссылку " PdfiumViewer "к вашему проекту Ссылки

3) Используйте следующий код:

using (var pdfDocument = PdfiumViewer.PdfDocument.Load(@"document.pdf"))
{
    var bitmapImage = pdfDocument.Render(0, 300, 300, true);
    bitmapImage.Save(@"image.bmp", ImageFormat.Bmp);
}

10
задан Mohamed Faramawi 30 October 2008 в 22:08
поделиться

9 ответов

События. Всегда отказывайтесь от подписки от событий, это является единственным большая часть обеспечивающей утечку функции.NET.

Подписка на средства события "уведомляет и содержит меня, в то время как Вы живы", не "уведомляют меня, в то время как я жив". Отказ отказаться от подписки от события обычно приводит к большим кластерам зависания объектов, особенно в UI.

12
ответ дан 3 December 2019 в 14:35
поделиться

установите корневые ссылки в NULL после использования.

Более подробная информация: Если мы забываем аннулировать базированные ссылки, GC предотвращен от эффективного освобождения памяти как можно быстрее, приведя к большему объему потребляемой памяти для приложения. Проблема может быть тонкой, такой как метод, который создает большой график временных объектов прежде, чем выполнить удаленный вызов как запрос базы данных или вызов к веб-сервису. Если сборка "мусора" происходит во время удаленного вызова, весь график отмечен достижимый и не собран. Это становится еще более дорогостоящим, потому что объекты, переживающие набор, способствуются следующему поколению, которое может привести к кризису среднего возраста.

6
ответ дан 3 December 2019 в 14:35
поделиться

Каждый DataTable. NewRow () должен иметь соответствие DaraTable. Строки. Добавьте (...).

2
ответ дан 3 December 2019 в 14:35
поделиться

Знайте о сложности всего, что Вы делаете, в максимально возможной степени, и думаете о каждой ситуации вместо того, чтобы полагаться на догму. Например, также знайте, что использование StringBuilder является не всегда правильным способом присоединиться к строкам :)

Где возможно, попытайтесь передать данные потоком вместо того, чтобы буферизовать его - необходимо быть осторожными здесь когда дело доходит до LINQ к Объектам, поняв, какой буфер операторов и который поток (и которые делают обоих с различными последовательностями).

(Ни один из них не является действительно памятью "утечки" как таковые - но я думаю о местах, где можно быстро использовать больше памяти, чем Вы ожидаете.)

3
ответ дан 3 December 2019 в 14:35
поделиться

Удостоверьтесь, что Вы всегда располагаете объекты IDisposable. Кроме того, попытайтесь всегда использовать "использование (...)" блоки для объявления доступных объектов.

5
ответ дан 3 December 2019 в 14:35
поделиться

Не точно утечка памяти, но одна вещь, которая всегда получает меня:

Всегда Близко Ваши соединения SQL после использования их.

2
ответ дан 3 December 2019 в 14:35
поделиться
something.someEvent += new EventHandler(memoryhog.someMethod);
[...]
something.someEvent += new EventHandler(memoryhog.someMethod);
[...]
something.someEvent -= new EventHandler(memoryhog.someMethod);

Если Вы избежите отсоединять все обработчики событий от объекта затем объект, который реализует обработчик событий, то будет слоняться поблизости в памяти в течение времени жизни объекта с событием.

Библиотека Managed DirectX имела ошибку как это, которое вызовет утечки памяти большой емкости.

1
ответ дан 3 December 2019 в 14:35
поделиться

Характерный для.NET Компактная Платформа: необходимо расположить все связанные с графикой объекты (Графика, Перо, SolidBrush, Битовый массив) явно, или иначе они будут бродить вокруг в памяти (не большой, когда Вы будете работать с низкими запоминающими устройствами).

1
ответ дан 3 December 2019 в 14:35
поделиться

При использовании взаимодействующий с COM, используйте Маршала. ReleaseComObject после того, как Вы сделаны с COM-объектом для выпуска Обертки вызовов среды выполнения (RCW).

Кроме того, если Ваш COM-объект имеет свойство или метод, который возвращает другой COM-объект, заботьтесь, чтобы всегда присвоить его переменной и выпустить его впоследствии.

Т.е. это пропустит объект, полученный GetFirstChild:

string name = myBigComObject.GetFirstChild().Name;

Используйте istead:

ChildComObject firstChild = myBigComObject.GetFirstChild()
string name = firstChild.Name;
Marshal.ReleaseComObject(firstChild);
1
ответ дан 3 December 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: