저는 다중 스레드를 통해 main 함수를 호출하는 API에서 작업하고 있습니다. 그 함수를 통해 다른 클래스의 Bitmap에 접근하여 그것으로부터 쓰기를 시도하고 있지만, 객체의 완전히 다른 인스턴스를 사용하도록 설정 한 후에도 InvalidOperationException이 발생합니다 : 비트 맵 영역이 이미 잠겨 있습니다.비트 맵 영역은 이미 잠겨져 있고 멀티 스레드 환경입니다.
주 함수에서 코드를 잠그고 Bitmap.LockBits (...)를 호출하려고했습니다. 예, UnlockBits가 끝나면 호출됩니다.
/* Part of Class B */
public Surface imageSurface //Surface is a field of pixels, more or less.
{
get
{
if (_CurrImage != null && _imageSurface == null)
{
_imageSurface = Surface.CopyFromBitmap(_CurrImage);
return Surface.CopyFromBitmap(_imageSurface.CreateAliasedBitmap());
}
else
{
Surface clearPixel = new Surface(1, 1);
clearPixel[0, 0] = ColorBgra.FromBgra(255, 255, 255, 0);
return clearPixel;
}
}
}
/* the "main" function, Class A */
public override void Render(ClassBPrototype parameters, ...)
{
ClassB token = (ClassB)parameters; // Here we go again~!
...
Surface ourSurface = dstArgs.Surface;
if (token.imageSurface.Size != null)
{
ourSurface = token.imageSurface;
}
lock(typeof(ClassA))
{
for (int lRectangleIndex = ...)
{
Rectangle lRectangle = rois[lRectangleIndex];
for (int y = ...)
{
surfaceY = (ourSurface.Height/2) - (y - (int)CenterY);
for (int x = ...)
{
surfaceX = (ourSurface.Width/2) - (x - (int)CenterX);
if (surfaceX >= 0 && surfaceX < ourSurface.Width && surfaceY >= 0 && surfaceY < ourSurface.Height)
{
dstArgs.Surface[x, y] = ourSurface[surfaceX, surfaceY];
}
else
{
dstArgs.Surface[x, y] = ColorBgra.FromBgra(255, 255, 255, 0);
}
}
}
}
}
}
문제를 나타내는 작고 완벽한 예를 게시하십시오. –
@Andrew : 내 생각은 "완전히 다른 인스턴스"의 정의가 핵심으로 들립니다. –
관련성이 없지만 나에게 맞는 것은 아닙니다. 당신은 잠글해서는 안됩니다 (typeof (ClassA)). 나는 보통 개인 변수를 잠급니다. 자세한 내용은 여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.80).aspx –