2

我有一个要保存的位图,并且不断收到“对象当前在其他地方使用”错误。现在我知道 GDI+ 使用线程很糟糕,我应该使用该lock{}语句,但它不起作用。我的代码在下面,我做错了什么?

Bitmap bitmap = new Bitmap();

lock (bitmap)
{
    bitmap.Save([filepath], ImageFormat.Png);
}
4

4 回答 4

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

于 2012-05-14T17:02:04.980 回答
3

您应该锁定其他虚拟对象:

var objectForLock = new object()

lock (objectForLock)
{
    Bitmap bitmap = new Bitmap();
    bitmap.Save([filepath], ImageFormat.Png);
}

不确定这是否是您的问题,但这就是lock.Net 中的工作方式。

于 2012-05-14T17:03:08.623 回答
2

您应该在初始化位图之前锁定同步。

于 2012-05-14T17:01:12.540 回答
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
}
于 2012-05-14T17:06:09.543 回答