将位图传递给后台工作线程

时间:2012-07-08 20:31:46

标签: c# .net bitmap thread-safety

我知道位图不是线程安全的,因此使用此解决方法

                   Bitmap[] blobCopies = MakeBlobCopies(bmpBlob, 2);

                    BackgroundWorker bw1 = new BackgroundWorker();
                    bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
                    bw1.RunWorkerAsync(blobCopies[0]);

                    BackgroundWorker bw2 = new BackgroundWorker();
                    bw2.DoWork += new DoWorkEventHandler(bw2_DoWork);
                    bw2.RunWorkerAsync(blobCopies[1]);

                    DisposeBlobCopies(blobCopies);

在Backgroundwork事件句柄中,我对位图应用了一些过滤器,但是我得到了一个访问冲突异常


System.AccessViolationException was unhandled
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.SafeNativeMethods.Gdip.GdipBitmapLockBits(HandleRef bitmap, GPRECT& rect, ImageLockMode flags, PixelFormat format, BitmapData lockedBitmapData)
       at System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)
       at System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)

我甚至没有处理位图(我需要避免窒息内存)。 BUt仍然得到这个例外。我需要从工作线程中返回任何内容 这是否立即接近这个?有什么想法吗?

    private Bitmap[] MakeBlobCopies(Bitmap originalBitmap, int n)
    {
        Bitmap[] blobCopies = new Bitmap[n];
        for (int i = 0; i < n; i++)
        {
            blobCopies[i] = (Bitmap)originalBitmap.Clone();
        }
        return blobCopies;
    }

1 个答案:

答案 0 :(得分:1)

不,位图是线程安全的。它们受内部锁保护,当你尝试在另一个线程写入位图时读取位图时会出现异常。

在线程使用位置时处置位图是危险的,这会使地垫晃动。特别是当您使用Bitmap.Clone()时,它不会复制像素数据。只有Bitmap(Image)构造函数才能这样做。您需要为Bitmap.Dispose()调用找到一个更好的位置。就像在DoWork或RunWorkerCompleted事件处理程序中一样,之后,您确定不再访问位图。