这种模式似乎对我来说在这个线程不安全的环境中实现线程锁定。
然而,在模式和最佳实践方面(特别是我自己已经弄清楚了),我并没有因为暴露两个整理相同结果的集合而过度生气。但是不安全的集合确实需要公开暴露,我不想让它成为私有的,并且有一个'AddResult(x)'方法。
这是解决此问题的正确方法吗?
public class UnsafeObject
{
public ObservableCollection<HighSpeedObject> ResultsUnsafe { get; set; }
/// Accessed by UI thread once every 100ms
public List<HighSpeedObject> Results
{
get
{
lock (_padlock)
{
return ResultsUnsafe.ToList();
}
}
}
private readonly static object _padlock = new object();
}
答案 0 :(得分:3)
ObservableCollectionz<T>
class的实例不是线程安全的,因此您的解决方案不稳定。
Results
属性中的锁只能确保一次一个线程可以使用该属性,但它不保护ResultsUnsafe
属性。其他线程可以更改ResultsUnsafe
属性中的集合,而Results
属性正在从中创建列表。
附注:您正在使用静态成员作为非静态数据锁的标识符。这意味着锁将阻止在类的所有实例中进行访问,而不仅仅是要保护数据的实例。要保护静态数据,您应该使用静态成员作为标识符,并且为了保护实例数据,您应该使用实例成员作为标识符。