【问题标题】:Using the lock statement使用锁语句
【发布时间】:2012-05-15 01:06:09
【问题描述】:

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

Bitmap bitmap = new Bitmap();

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

【问题讨论】:

    标签: c# multithreading bitmap locking save


    【解决方案1】:

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

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

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

    【讨论】:

    • @svick 这是一个不好的做法,因为如果其他东西试图锁定您的实例怎么办?
    • @DanielA.White。对于BitMap,它确实...:)
    • 我会用什么来代替位图?我正在尝试这个锁的东西,但我似乎没有任何运气。
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 我想这可能是我被绊倒的地方。如果多个类访问同一个位图怎么办。如何让它锁定同一个对象?
        • 作弊方法使要锁定的对象在某处成为 public static锁。请注意,@Daniel A. White 可能是正确的,需要将对位图的访问编组到原始线程,这意味着锁定对您没有帮助...稍后您可以重构代码,以便在需要的地方使锁定对象可访问(也许通过包装所有操作)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多