ネイティブ dll のラッパーであるサードパーティ ライブラリを使用しています。ライブラリには type が含まれ、XImageいくつXImageかのプロパティとIntPtr Data()メソッドがあります。XImageも実装IDisposableしていますが、正しく実装されているかどうかはわかりません。
XImageTCP 接続から多くの を取得し、 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定期的に呼び出しますが、アプリケーションが短時間フリーズするため、このアプローチは使用したくありません。