ネイティブ dll のラッパーであるサードパーティ ライブラリを使用しています。ライブラリには type が含まれ、XImage
いくつXImage
かのプロパティとIntPtr Data()
メソッドがあります。XImage
も実装IDisposable
していますが、正しく実装されているかどうかはわかりません。
XImage
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 - デバッグの開始) からプログラムを実行すると、すべて問題ありませんが、.exe
ファイルまたは (ctrl + F5 - デバッグなしで開始) からプログラムを実行すると、メモリ使用量がどんどん大きくなります。 (ビルド構成: リリース - X86)を取得するまでOutOfMemoryException
。私は何をすべきか ?
- - 編集 - -
GC.AddMemoryPressure
私は、ガベージコレクションをより頻繁に実行することを発見しましたGC.RemoveMemoryPressure
。私の問題は、大きなアンマネージメモリへのハンドルを持つ小さなオブジェクトがあり、GC がこれらの小さなオブジェクトを収集していないことです。
----編集----
呼び出しGC.Collect
は実行時に問題を解決します。タイマーを設定してGC.Collect
定期的に呼び出しますが、アプリケーションが短時間フリーズするため、このアプローチは使用したくありません。