2014-05-06 227 views
1

我得到CollectionBitmap对象。 需要创建多个Tasks,通过这个Collection作为参数。在任务方法中,我将读取每个Bitmap的高度/宽度,然后将此Collection和高度/宽度数组发送到Wcf服务。位图线程安全只读吗?

那么它是线程安全操作吗?我应该如何在这种情况下行事?

+0

你必须发送高宽数组到你的WCF服务? –

+0

个人而言,在阅读了简要说明之后,我只是使用PLINQ来处理收集并发送结果。只要你不共享可变状态,它应该是可以的。 –

+1

说实话,这似乎很难完成任务。 –

回答

5

不是,位图的行为不像“普通”对象。 Bitmap对象上的许多操作都涉及对Bitmap.LockBits()的底层调用。简单的事情,比如调用Save()方法或者使用Graphics.DrawImage()或者非常慢的GetPixel()方法绘制位图需要锁定位图以访问像素数据的内存映射视图。

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

这有很多副作用,例如解释程序员在发现图像文件被锁定并且不能被覆盖时遇到的常见问题。 MMF施加该锁。而一个严格的限制是一个位图只能被锁定一次。换句话说,Bitmap对象上只能有一个不平凡的操作同时发生。因此,当另一个工作线程尝试使用相同的位图对象执行某些操作时,您的代码易于随机崩溃,并且您不需要添加防止发生这种情况所需的同步。