我收到此错误,看起来是因为不同的线程正在访问同一个 Bitmap 对象。然而我到处都使用锁。
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
}
}
}
Class MySingleInstanceClass
将只有一个实例。致电MyImage
and Refresh()
可能来自不同的线程。据我了解,里面的代码lock(locker)
直到在另一个线程中完成后才会执行,但我仍然收到错误。谁能指出代码中的缺陷吗?
异常看起来像这样:
System.Drawing.dll 中发生“System.InvalidOperationException”类型的第一次机会异常
错误:对象当前正在其他地方使用。
在System.Drawing.Graphics.FromImage(图像图像)
at(指向包含 var g = Graphics.FromImage(myImage); 的行)
the locker
对象不是静态的;因此,每个新实例都会创建自己的储物柜;你需要创建locker
作为静态,以防止在使用多个对象时从其他线程访问。
private static Object locker = new Object();
对于单个对象场景,使用非静态类级别变量作为储物柜是合适的。如果你采用这种场景,我觉得Singleton的实现存在一些问题。
UPDATE:
public sealed class MySingleInstanceClass
{
private static volatile MySingleInstanceClass instance;
private static object syncRoot = new Object();
private Bitmap myImage;
private MySingleInstanceClass()
{
myImage = new Bitmap(100, 100);
}
public static MySingleInstanceClass Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new MySingleInstanceClass();
}
}
return instance;
}
}
public Bitmap MyImage
{
get
{
lock (syncRoot)
return myImage;
}
private set
{
lock (syncRoot)
myImage = value;
}
}
public void Refresh()
{
lock (syncRoot)
{
var g = Graphics.FromImage(myImage);
// do more processing
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)