我的印象是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()
ing并创建一个新的位图。都不行。我尝试锁定在
this
(如图所示)和位图对象上。都不行。我是否以一种我不应该使用的方式使用
lock()
?我误会了它的目的吗?如何防止InvalidOperationException
? 最佳答案
可能尝试将对象用于锁定目的,而不是锁定“ this”。
类级变量
private static object syncRoot = new Object();
而当你使用
lock (syncRoot)
{
....
}