Ich erhalte diesen Fehler und es sieht so aus, als ob auf dasselbe Bitmap-Objekt von verschiedenen Threads zugegriffen wird. Allerdings benutze ich Schlösser überall damit.Objekt wird derzeit an anderer Stelle verwendet
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
}
}
}
Klasse MySingleInstanceClass
wird nur eine Instanz haben. Anrufe zu MyImage
und Refresh()
können von verschiedenen Threads kommen. Soweit ich verstehe, wird der Code innerhalb lock(locker)
nicht ausgeführt, bis es in einem anderen Thread fertig ist, aber ich bekomme immer noch den Fehler. Kann jemand auf einen Fehler im Code hinweisen?
Ausnahme sieht wie folgt aus:
A first chance exception of type 'System.InvalidOperationException' occurred in System.Drawing.dll
Error: Object is currently in use elsewhere.
at System.Drawing.Graphics.FromImage(Image image)
at (points to the line containing var g = Graphics.FromImage(myImage);)
das Schloss in der Getter/Setter scheint sinnlos .... –
Was denkst du, was du erreichst, wenn du den Getter (und den privaten Setter?) Von MyImage sperrst? Ich denke nur laut nach, also glaube nicht, dass ich die Lösung habe, aber würde es nicht mehr Sinn machen, wenn das Sperrverhalten in der verbrauchenden Klasse dieser Klasse wäre? – bas
@MitchWheat Nun, ich stelle sicher, dass ein Thread, der MyImage aufruft, wartet, bis der Thread, der Refresh() aufruft, den Codeblock dort beendet, andernfalls werde ich myImage zurückgeben, bevor die Verarbeitung abgeschlossen ist. Denkst du, ich brauche es nicht? Warum? –