lock()
複数のスレッドがオブジェクトに同時にアクセスするのを防ぐという印象を受けました。
ただし、InvalidOperationException (オブジェクトは現在別の場所で使用されています) は、次のコードによって依然として頻繁にスローされます。
lock (this)
{
localCopy = (Bitmap)this.bm.Clone();
int x, y;
float pX = this.p.x;
int width = localCopy.Width;
x = (int)Math.Round((double)(pX * (float)width));
if (x >= localCopy.Width) x = localCopy.Width - 1;
y = (int)Math.Round((double)(this.p.y * (float)localCopy.Height));
if (y >= localCopy.Height) y = localCopy.Height - 1;
colourPixel = localCopy.GetPixel(x, y);
}
注意すべき点:
x
例外の原因を特定するために、 の計算を分割しました。ビットマップへのアクセスに由来するようです。- ビットマップのローカル コピーを作成しようとしましたが、これにより同じ例外が発生します。
Clone()
新しいビットマップを作成して作成しようとしました。どちらも機能しません。 - 私は
this
(見たように)とビットマップオブジェクトをロックしようとしました。どちらも機能しません。
lock()
想定されていない方法で使用しようとしていますか? その目的を誤解していますか?どうすればInvalidOperationException
sを防ぐことができますか?