【发布时间】:2014-10-28 14:54:08
【问题描述】:
我想访问可以被其他代码修改的属性,并确保对它的访问是线程安全的。当然,这个问题已经是asked and answered了。
但是,在我的特殊情况下,我有不同的具体问题。首先,多线程访问/修改场景,想必是很少见的情况,这种情况下我不会担心性能问题。此外,该属性本身非常大——它是一个浮动数组,大小可达 4096 x 4096,我想尽可能少地复制它。最后,我希望类接口易于使用——this solution 并非如此,因为它要求用户隐式锁定一个特殊的 SyncRoot。
是否有一种解决方案可以使我的属性线程安全,不需要额外的复制,并且允许客户端使用 getter(setter 是私有的)而无需记住锁定任何东西?
【问题讨论】:
-
如果它很少更改,并且您使用的是 .NET 4.5,您可以使用 ReadOnlyCollection 并在 getter 中返回它。然后有一个单独的“SetUpdatedCollection”方法或类似方法,它会丢弃旧的 ReadOnlyCollection 并创建一个新的。在 getter 和 SetUpdatedCollection 方法中使用内部锁对象,并发将被强制执行。
-
锯齿状数组是在其他线程上“调整大小”还是只修改了其内容?调整大小的情况要复杂得多,因为您不仅要担心同步访问数据,还要担心任何大小的缓存读取。
-
@user469104 由于我无法控制的原因 (Unity3d),我被锁定到 .NET 2.0
标签: c# properties thread-safety