我的印象是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?