Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用lock语句_C#_Multithreading_Bitmap_Locking_Save - Fatal编程技术网

C# 使用lock语句

C# 使用lock语句,c#,multithreading,bitmap,locking,save,C#,Multithreading,Bitmap,Locking,Save,我有一个位图,我正试图保存,我不断得到“对象当前在别处使用”错误。现在我知道GDI+在线程方面很糟糕,我应该使用lock{}语句,但它不起作用。我的代码在下面,我有什么不正确的地方吗 Bitmap bitmap = new Bitmap(); lock (bitmap) { bitmap.Save([filepath], ImageFormat.Png); } 应在初始化位图之前锁定同步。不应锁定要锁定的对象。您应该创建一个新引用并锁定它 object bitmapLock = ne

我有一个位图,我正试图保存,我不断得到“对象当前在别处使用”错误。现在我知道GDI+在线程方面很糟糕,我应该使用
lock{}
语句,但它不起作用。我的代码在下面,我有什么不正确的地方吗

Bitmap bitmap = new Bitmap();

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

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

不应锁定要锁定的对象。您应该创建一个新引用并锁定它

object bitmapLock = new object();
Bitmap bitmap = new Bitmap();

lock (bitmapLock)
{
    bitmap.Save([filepath], ImageFormat.Png);
}
位图可能会锁定在您无法控制的不同位置

阅读此处的
lock
语句

编辑您可能必须修改创建位图的线程上的位图


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

var objectForLock = new object()

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

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

您需要锁定所有操作,而不仅仅是保存。锁定仅保存不会阻止其他线程操作位图

请注意,最好按照每个人的建议锁定单独的对象

// 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
}

@svick这是一种糟糕的做法,因为如果有其他东西试图锁定您的实例怎么办?@DanielA.White。使用
位图
,它确实<代码>:)我应该用什么来代替位图?我在试这个锁的东西,但我似乎一点运气都没有。我想这可能是我被绊倒的地方。如果多个类正在访问同一位图,该怎么办。如何让它锁定在同一个对象上?欺骗方法使要锁定的对象成为某个地方的
公共静态
,这可能是一个很好的开始,看看当位图的所有访问都使用相同的锁进行保护时,代码是否真的起作用。请注意,@Daniel A.White关于需要将对位图的访问封送到原始线程的说法可能是正确的,这意味着锁定不会帮助您。。。稍后,您可以重构代码,使锁定对象在需要时可以访问(可能通过包装所有操作)。