使用lock语句

时间:2012-05-14 17:00:28

标签: c# multithreading bitmap locking save

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

Bitmap bitmap = new Bitmap();

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

4 个答案:

答案 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
}