最近、ビットマップへのアクセスで多くの厄介な 問題が発生しており、アプリケーションの設計を再評価する必要があると考え始めています。
現在、他の 2 つのオブジェクトを作成する 1 つのオブジェクトがあります。これらのうちの 1 つは一連のビットマップ (たとえば、Web カメラから) を提供し、もう 1 つは一連の座標ペア (たとえば、マウスまたはタッチパッドから) を提供します。親オブジェクトには、子オブジェクトが生成するイベントのリスナーがあります。イベントには、新しい情報 (ビットマップまたは座標) をペイロードとして運ぶカスタム引数があります。例えば:
public class NewImageEventArgs : EventArgs
{
public NewImageEventArgs(Bitmap image)
{
Image = image;
}
public Bitmap Image { get; private set; }
}
親オブジェクトのリスナー メソッドは、ペイロードをオブジェクト レベルの表現にコピーします。いずれかのリスナー (ビットマップまたは座標) がトリガーされると、続いて共有メソッドが呼び出され、ビットマップと座標の両方を使用して計算が行われます。
private void PointerModule_NewPosition(object sender, NewPositionEventArgs e)
{
this.p = e.Position;
this.Invalidated();
}
OutOfMemory および InvalidOperation (「オブジェクトは現在、別の場所で使用されています」) 例外で繰り返し発生する問題は、新しいイベントがそれぞれ別のスレッドにある可能性があるという事実に起因しているように思えます。ビットマップが 1 つのスレッドで使用されている場合、別のスレッドが同時にアクセスしようとすると例外が発生します。
プログラムの形を根本的に変える必要がありますか? この種の問題を解消するために講じることができる予防策はありますか?