C# 使用lock语句
我有一个位图,我正试图保存,我不断得到“对象当前在别处使用”错误。现在我知道GDI+在线程方面很糟糕,我应该使用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
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关于需要将对位图的访问封送到原始线程的说法可能是正确的,这意味着锁定不会帮助您。。。稍后,您可以重构代码,使锁定对象在需要时可以访问(可能通过包装所有操作)。