c# - 位图线程安全只读吗?

标签 c# .net multithreading thread-safety task

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

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

最佳答案

事实并非如此,Bitmap 的行为根本不像一个“普通”对象。 Bitmap 对象上的许多操作都涉及对 Bitmap.LockBits() 的基础调用。您要做的简单事情,例如调用 Save() 方法或使用 Graphics.DrawImage() 绘制位图或臭名昭著的慢速 GetPixel() 方法需要锁定位图才能访问像素数据的内存映射 View .

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

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

关于c# - 位图线程安全只读吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23495701/

相关文章:

C# .NET 打印出格式化的 ArrayList

c# - 我的 C# Entity Frameworks 项目闹鬼了吗?

java - 设置 Java 线程的优先级

java - 从两个不同的线程访问同一个变量

python - 我这里有线程问题吗?

c# - ASPX 访问母版页功能

c# - 合并 xml 命名空间

c# - PowerShell 和 C# 在枚举集合时的区别

c# - JQuery .each 函数

.net - 从包含字母和空格的字符串中解析整数 - C#