我知道位图不是线程安全的,因此使用此解决方法
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;
}
答案 0 :(得分:1)
不,位图是线程安全的。它们受内部锁保护,当你尝试在另一个线程写入位图时读取位图时会出现异常。
在线程使用位置时处置位图是危险的,这会使地垫晃动。特别是当您使用Bitmap.Clone()时,它不会复制像素数据。只有Bitmap(Image)构造函数才能这样做。您需要为Bitmap.Dispose()调用找到一个更好的位置。就像在DoWork或RunWorkerCompleted事件处理程序中一样,在之后,您确定不再访问位图。