L'objet est actuellement en cours d'utilisation ailleurs

J'obtiens cette erreur, et il semble que c'est parce que l'image même de l'objet est accessible par différents threads. Cependant, je suis en utilisant des verrous partout avec elle.

public class MySingleInstanceClass
{
    private Object locker = new Object();

    private Bitmap myImage = new Bitmap(100, 100);

    public Bitmap MyImage
    {
        get
        {
            lock (locker)
                return myImage;
        }
        private set
        {
            lock (locker)
                myImage = value;
        }
    }

    private void Refresh()
    {
        lock (locker)
        {
            var g = Graphics.FromImage(myImage);
            //do more processing
        }
    }
}

Classe MySingleInstanceClass aura qu'une seule instance. Les appels à MyImage et Refresh() peut venir de différents threads. Comme je le comprends, le code à l'intérieur lock(locker) ne sera pas exécutée jusqu'à ce qu'il a fini dans un autre thread, mais j'ai toujours l'erreur. Quelqu'un peut-il point une faille dans le code?

Exception ressemble à ça:

Une exception de première chance de type 'System.InvalidOperationException' s'est produite dans System.Drawing.dll

Erreur: l'Objet est actuellement en usage ailleurs.

au Système.De dessin.Les graphiques.FromImage(Image)

à (les points de la ligne contenant var g = Graphiques.FromImage(myImage);)

  • la serrure à l'intérieur de la getter/setter semble inutile....
  • que pensez-vous de ce que vous atteindre avec verrouillage de la lecture (et le privé setter?) de MyImage? Je suis juste en pensant à haute voix pour ne présumez pas que j'ai la solution, mais ne serait-il pas plus de sens si le verrouillage de comportement dans la classe de consommateurs de cette classe?
  • et bien, je vais faire en sorte qu'une thread qui appelle MyImage attend jusqu'à ce que le thread qui appelle Refresh() termine le bloc de code là, sinon je vais retourner myImage avant qu'il soit terminé le traitement. Pensez-vous que je n'en avez pas besoin? Pourquoi?
  • Pouvez-vous afficher de message d'exception à l'intérieur de l'exception le cas échéant?
  • C'est fondamentalement ce qui est en question le titre; j'ai ajouté au bas de la page.