我有一个我正在尝试保存的位图,并且我不断收到“对象当前正在其他地方使用”错误。现在我知道GDI +糟透了线程并且我应该使用lock{}
语句,但它不起作用。我的代码在下面,我做错了什么?
Bitmap bitmap = new Bitmap();
lock (bitmap)
{
bitmap.Save([filepath], ImageFormat.Png);
}
答案 0 :(得分:3)
您不应该锁定要锁定的对象。你应该创建一个新的引用并锁定它。
object bitmapLock = new object();
Bitmap bitmap = new Bitmap();
lock (bitmapLock)
{
bitmap.Save([filepath], ImageFormat.Png);
}
位图可能锁定在您无法控制的不同位置。
在此处阅读lock
声明。
编辑您可能需要修改创建它的线程上的位图。
http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.80).aspx
答案 1 :(得分:3)
你应该锁定其他虚拟对象:
var objectForLock = new object()
lock (objectForLock)
{
Bitmap bitmap = new Bitmap();
bitmap.Save([filepath], ImageFormat.Png);
}
不确定这是不是你的问题,但这就是lock
在.Net中运作的方式。
答案 2 :(得分:2)
在初始化位图之前,您应该锁定同步。
答案 3 :(得分:1)
您需要锁定所有操作,而不仅仅是保存。锁定仅保存不会阻止其他线程操纵位图。
请注意,最好按照每个人的建议锁定单独的对象。
// class member (or even static)
private object bitmapLock = new object();
// function 1
lock (bitmapLock)
{
bitmap.Save([filepath], ImageFormat.Png);
}
// function 2
lock (bitmapLock)
{
// Draw bitmap
}