2

这种模式似乎对我在这个线程不安全的环境中实现线程锁定有用。

然而,就模式和最佳实践而言(尤其是我自己已经弄清楚了),我对公开两个整理相同结果的集合并不过分生气。但是不安全的集合确实需要公开公开,我不想将其设为私有并使用“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();
}
4

1 回答 1

3

ObservableCollectionz<T>的实例不是线程安全的,因此您的解决方案不稳定。

属性中的锁Results只确保一次有一个线程可以使用该属性,但它不保护该ResultsUnsafe属性。其他线程可以在属性从中创建列表时更改ResultsUnsafe属性中的集合。Results


旁注:您正在使用静态成员作为非静态数据锁定的标识符。这意味着锁将阻止对类的所有实例的访问,而不仅仅是您要保护的数据所在的实例。要保护静态数据,您应该使用静态成员作为标识符,并且要保护实例数据,您应该使用实例成员作为标识符。

于 2013-02-17T22:07:29.820 回答