Я использую стороннюю библиотеку, которая является оберткой вокруг родной DLL. библиотека содержит тип XImage
, XImage
имеет некоторые свойства и метод IntPtr Data()
. XImage
также реализует IDisposable
, но я не знаю, правильно ли оно выполнено.Работа с неуправляемыми ресурсами
Я получаю много XImage
s из соединения TCP и показываю их как фильм в PictureBox
.
Я использовал для преобразования 'XImage' в System.Drawing.Image
и просматривать их в PictureBox
, но я получил AccessViolationException
.
Поэтому я сделал обертку вокруг XImage
под названием Frame
.
public class Frame : IDisposable
{
public uint size { get; private set; }
private Image image;
public XImage XImage { get; set; }
public Image Image { get { return image ?? (image = GetBitmap(this.XImage)); } }
public DateTime Time { get; set; }
public Frame(XImage xImage)
{
this.XImage = xImage;
this.size = XImage.ImageBufferSize();
GC.AddMemoryPressure(size);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Frame()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
try
{
image.Dispose();
}
catch { }
finally
{
image = null;
}
try
{
MImage.Dispose();
}
catch { }
finally { XImage = null; }
}
GC.RemoveMemoryPressure(size);
}
}
и обработки ссылок на Frame
Я решил AccessViolationException
. теперь у меня есть еще одна проблема, когда я запускаю программу из visual studio (F5 - Start Debugging), все в порядке, но когда я запускаю ее из файла .exe
или (ctrl + F5 - Start без отладки), использование памяти увеличивается и больше, пока не получу OutOfMemoryException
. (Конфигурация Biuld: Release - X86). что мне делать ?
---- EDIT ----
Я обнаружил, что GC.AddMemoryPressure
или GC.RemoveMemoryPressure
только делает сбор мусора, чтобы работать более часто, и моя проблема в том, что в настоящее время у меня есть небольшие объекты, которые имеют дескриптор большая неуправляемая память, а GC не собирает эти маленькие объекты.
---- EDIT ----
вызова GC.Collect
решит проблему во время выполнения, я установить таймер и вызвать GC.Collect
периодически, но это делает замораживание приложения в течение короткого периода, так Я не хочу использовать этот подход.
Вы не решили это, вы просто спрятали его, поймав все исключения. Возникновение проблемы позже неизбежно. Погрузите библиотеку, которая дает вам такие проблемы. –
Вы просто глотаете все исключения в свой метод 'Dispose()'. Скорее всего, «XImage» фактически не удался. – angelsl
@HansPassant: Я думаю, что библиотека в порядке. Я устанавливал таймер и вызывал GC.Collect() каждые 30 секунд и решал «OutOfMemoryException», но это не очень хороший подход. почему запуск под отладчиком отличается от работы без отладчика? – HPT