Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程不安全对象中的这种锁定模式有什么问题吗?_C#_Multithreading_Locking - Fatal编程技术网

C# 线程不安全对象中的这种锁定模式有什么问题吗?

C# 线程不安全对象中的这种锁定模式有什么问题吗?,c#,multithreading,locking,C#,Multithreading,Locking,在这个线程不安全的环境中,这个模式似乎在为我实现线程锁定而工作 然而,就模式和最佳实践而言(特别是我自己已经弄清楚了),我并不过分热衷于公开两个整理相同结果的集合。但是不安全的集合确实需要公开,我不想让它成为私有的,并使用“AddResult(x)”方法 这是解决这个问题的正确方法吗 public class UnsafeObject { public ObservableCollection<HighSpeedObject> ResultsUnsafe { get; set

在这个线程不安全的环境中,这个模式似乎在为我实现线程锁定而工作

然而,就模式和最佳实践而言(特别是我自己已经弄清楚了),我并不过分热衷于公开两个整理相同结果的集合。但是不安全的集合确实需要公开,我不想让它成为私有的,并使用“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();
}
公共类非安全对象
{
公共ObservableCollection ResultsUnsafe{get;set;}
///UI线程每100ms访问一次
公开名单结果
{
得到
{
锁(挂锁)
{
返回结果safe.ToList();
}
}
}
私有只读静态对象_挂锁=新对象();
}
的实例不是线程安全的,因此您的解决方案不稳定

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



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

锁定会导致并发操作序列化。