1

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

                   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)

我什至没有处理位图(我需要避免阻塞内存)。但是仍然得到这个例外。我不需要工作线程返回任何东西,这是否可以立即处理?有任何想法吗?

    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;
    }
4

1 回答 1

1

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

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

于 2012-07-08T20:38:31.947 回答