Je travaille dans une API qui appelle la fonction principale via plusieurs threads. J'essaye d'accéder à travers cette fonction un Bitmap dans une autre classe et j'écris dessus, mais même après l'avoir configuré pour utiliser une instance complètement différente de l'objet, je rencontre une InvalidOperationException: la région Bitmap est déjà verrouillée.La région bitmap est déjà verrouillée, environnement multithread
J'ai essayé le code de verrouillage dans la fonction principale et où Bitmap.LockBits (...) est appelé. Oui, UnlockBits est appelé quand j'ai terminé.
/* 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);
}
}
}
}
}
}
Veuillez publier un petit exemple complet illustrant le problème. –
@Andrew: mes pensées exactement - la définition de "instance complètement différente" sonne clé. –
Il ne peut pas être lié mais il ne me semble pas juste. Vous ne devriez pas verrouiller (typeof (ClassA)). Je verrouille normalement une variable privée. Voir ici pour plus de détails http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.80).aspx –