Проблема производительности WPF с неуправляемыми объектами - PullRequest
1 голос
/ 10 октября 2011

Я разработал приложение в WPF на C #.Приложение включает в себя стороннюю DLL для отображения камеры в определенном окне.

Обычно приложение занимает память 90 МБ - 135 МБ без объекта камеры (неуправляемый объект).т.е. я удалил весь код, помечающий объект камеры в дизайне и кодовой странице (xaml и xaml.cs).Память увеличивается и останавливается на одном максимальном значении.

Если я использую объект камеры в приложении, память постепенно увеличивается.Когда я каждый раз открываю окно камеры, память постепенно увеличивается, например, 135 МБ, 141 МБ, 143 МБ ....

Я использовал GC. Соберите и Использование оператора для всех необходимых мест для очистки управляемой памяти.Я не могу уменьшить или остановить увеличение памяти.

Как решить эту проблему?

Любые предложения оценят

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Использование GC.Collect обычно не уменьшает объем используемой памяти.Прекратите называть это, и вы можете увидеть некоторые улучшения.

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

Один небольшой тест, который может продемонстрировать это: что происходит, когда вы минимизируете свое .NET-приложение?Очень часто вы видите, что использование памяти в диспетчере задач резко падает, и оно не сразу восстанавливается при повторном отображении окна.

1 голос
/ 10 октября 2011

Имеется ли в компоненте неуправляемой камеры оболочка C #? Если это так, он реализует IDisposable? Гарантируя, что вы утилизируете объект камеры (если обернут), вызовет его деструкторы в неуправляемом коде

Неуправляемый код связан с вашим кодом C # через импорт DLL? Если это так, убедитесь, что вы вызываете все методы типа «Close ()» для освобождения памяти в C #. Я бы посоветовал обернуть компонент камеры в ваш собственный класс .NET, реализующий IDisposable, чтобы аккуратно упаковать это

Вы подписываетесь на какие-либо события .NET и не отписываетесь? Например Camera.ImageReceived + = новый EventHandler ... Если оставить подписки на события .NET открытыми, это может вызвать незначительную утечку памяти, поскольку сборщик мусора не может собрать объект, пока есть ссылка на него (через подписку на событие)

Наконец, грубый тест для проверки утечки памяти - оставить ваше приложение работающим на ночь с несколькими операциями создания / удаления окна камеры. Посмотрите, получите ли вы OutOfMemoryException на следующий день. Как упоминалось в предыдущих постерах, диспетчер задач не собирается точно сообщать об использовании памяти приложением .NET, однако кислотный тест заключается в том, освобождает ли ГХ в конечном итоге память или продолжает расти бесконечно?

1 голос
/ 10 октября 2011

Кажется вы ответили на свой вопрос :

Если я использую объект камеры в приложении, память постепенно увеличивается Когда я открываю окно камеры каждый раз, память будет постепенно увеличиваться, как 135 МБ, 141 МБ, 143 МБ ....

Я использовал GC.Collect и оператор Using для всего необходимого места очистить управляемую память. Я не могу уменьшить или остановить увеличение памяти.

Как указано выше, GC.Collect выполняет сборку мусора только для управляемых объектов, а не для неуправляемых объектов. Я предполагаю, что утечки памяти происходят из-за используемого вами объекта камеры, а не из управляемого кода. Тогда зачем вам винить GC.Collect в повышении памяти?

Вот почему я взял на себя вину за объект камеры:

Обычно приложение занимает 90 МБ памяти - 135 МБ без объект камеры (неуправляемый объект). я удалил весь код объект камеры в дизайне и кодовой странице (xaml и xaml.cs). память увеличивается и останавливается на одном максимальном значении.

Если я использую объект камеры в приложении, память постепенно увеличивается Когда я открываю окно камеры каждый раз, память будет постепенно увеличиваться, как 135 МБ, 141 МБ, 143 МБ ....

Тогда вам следует изучить элемент управления камерой, который вы использовали. Очевидно, виновником является управление камерой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...