我的印象是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)
{
....
}

09-10 17:17