readmap的位图线程是否安全?

时间:2014-05-06 13:11:42

标签: c# .net multithreading thread-safety task

我获得CollectionBitmap个对象。 需要创建多个Tasks,将此Collection作为参数传递。在任务方法中,我将读取每个Bitmap的高度/宽度,然后将此Collection和高度/宽度数组发送到Wcf服务。

那么线程安全操作吗?在这种情况下我该怎么做?

1 个答案:

答案 0 :(得分:5)

事实并非如此,Bitmap的行为与“正常”对象完全不同。 Bitmap对象上的许多操作都涉及对Bitmap.LockBits()的底层调用。你要做的很简单的事情,如调用Save()方法或使用Graphics.DrawImage()或臭名昭着的慢GetPixel()方法绘制位图需要锁定位图以访问像素数据的内存映射视图

您可能会认识到术语,MemoryMappedFile类在.NET Framework中公开了相同的低级操作系统功能。对于位图很重要,它们可以包含大量数据。通过使用MMF,可以将该像素数据保留在页面文件之外,并且可以从图像文件中将页面错误返回到RAM中。

这有许多副作用,例如它解释了程序员在发现图像文件被锁定且无法覆盖时遇到的常见问题。 MMF强加了锁定。一个硬约束是位图只能被锁定一次。或者换句话说,Bitmap对象上只能同时进行一次非常重要的操作。因此,当另一个工作线程尝试使用相同的位图对象执行某些操作时,您的代码可能会随机崩溃,并且您不会添加防止这种情况发生所需的同步。