РЕШЕНИЕ:
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);
}
События. Всегда отказывайтесь от подписки от событий, это является единственным большая часть обеспечивающей утечку функции.NET.
Подписка на средства события "уведомляет и содержит меня, в то время как Вы живы", не "уведомляют меня, в то время как я жив". Отказ отказаться от подписки от события обычно приводит к большим кластерам зависания объектов, особенно в UI.
установите корневые ссылки в NULL после использования.
Более подробная информация: Если мы забываем аннулировать базированные ссылки, GC предотвращен от эффективного освобождения памяти как можно быстрее, приведя к большему объему потребляемой памяти для приложения. Проблема может быть тонкой, такой как метод, который создает большой график временных объектов прежде, чем выполнить удаленный вызов как запрос базы данных или вызов к веб-сервису. Если сборка "мусора" происходит во время удаленного вызова, весь график отмечен достижимый и не собран. Это становится еще более дорогостоящим, потому что объекты, переживающие набор, способствуются следующему поколению, которое может привести к кризису среднего возраста.
Каждый DataTable. NewRow () должен иметь соответствие DaraTable. Строки. Добавьте (...).
Знайте о сложности всего, что Вы делаете, в максимально возможной степени, и думаете о каждой ситуации вместо того, чтобы полагаться на догму. Например, также знайте, что использование StringBuilder является не всегда правильным способом присоединиться к строкам :)
Где возможно, попытайтесь передать данные потоком вместо того, чтобы буферизовать его - необходимо быть осторожными здесь когда дело доходит до LINQ к Объектам, поняв, какой буфер операторов и который поток (и которые делают обоих с различными последовательностями).
(Ни один из них не является действительно памятью "утечки" как таковые - но я думаю о местах, где можно быстро использовать больше памяти, чем Вы ожидаете.)
Удостоверьтесь, что Вы всегда располагаете объекты IDisposable. Кроме того, попытайтесь всегда использовать "использование (...)" блоки для объявления доступных объектов.
Не точно утечка памяти, но одна вещь, которая всегда получает меня:
Всегда Близко Ваши соединения SQL после использования их.
something.someEvent += new EventHandler(memoryhog.someMethod);
[...]
something.someEvent += new EventHandler(memoryhog.someMethod);
[...]
something.someEvent -= new EventHandler(memoryhog.someMethod);
Если Вы избежите отсоединять все обработчики событий от объекта затем объект, который реализует обработчик событий, то будет слоняться поблизости в памяти в течение времени жизни объекта с событием.
Библиотека Managed DirectX имела ошибку как это, которое вызовет утечки памяти большой емкости.
Характерный для.NET Компактная Платформа: необходимо расположить все связанные с графикой объекты (Графика, Перо, SolidBrush, Битовый массив) явно, или иначе они будут бродить вокруг в памяти (не большой, когда Вы будете работать с низкими запоминающими устройствами).
При использовании взаимодействующий с COM, используйте Маршала. ReleaseComObject после того, как Вы сделаны с COM-объектом для выпуска Обертки вызовов среды выполнения (RCW).
Кроме того, если Ваш COM-объект имеет свойство или метод, который возвращает другой COM-объект, заботьтесь, чтобы всегда присвоить его переменной и выпустить его впоследствии.
Т.е. это пропустит объект, полученный GetFirstChild:
string name = myBigComObject.GetFirstChild().Name;
Используйте istead:
ChildComObject firstChild = myBigComObject.GetFirstChild()
string name = firstChild.Name;
Marshal.ReleaseComObject(firstChild);