2014-05-06 463 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對象上只能有一個不平凡的操作同時發生。因此,當另一個工作線程嘗試使用相同的位圖對象執行某些操作時,您的代碼易於隨機崩潰,並且您不需要添加防止發生這種情況所需的同步。