Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net 多属性的线程安全模式_.net_Multithreading_Properties_Thread Safety - Fatal编程技术网

.net 多属性的线程安全模式

.net 多属性的线程安全模式,.net,multithreading,properties,thread-safety,.net,Multithreading,Properties,Thread Safety,我有一个对象,它有大约15个属性,分别是String、decimal?和DateTime?还是整数?。 我有一个从多个线程操作的此类集合。我希望确保以线程安全的方式访问(读/写)对象属性的值,同时编写最少的代码。 有没有这样一种方法来代替使用私有后台程序和在每个属性的getter和setter中执行显式锁定? 以下是我现在要为每个酒店做的事情: public class ManyProperties { private Object mLock = new Object; pri

我有一个对象,它有大约15个属性,分别是String、decimal?和DateTime?还是整数?。 我有一个从多个线程操作的此类集合。我希望确保以线程安全的方式访问(读/写)对象属性的值,同时编写最少的代码。 有没有这样一种方法来代替使用私有后台程序和在每个属性的getter和setter中执行显式锁定? 以下是我现在要为每个酒店做的事情:

public class ManyProperties
{
    private Object mLock = new Object;
    private string _personName;
    public string PersonName {
        get {            
             lock (mLock){
                 return _personName;
             }           
        }
        set { 
             lock (mLock){
                  _personName = value; 
             }
        }
    }

    private string _beginAmount;
    public decimal? BeginAmount {
        get {            
             lock (mLock){
                 return _beginAmount;
             }           
        }
        set { 
             lock (mLock){
                  _beginAmount = value; 
             }
        }
    }
}

属性通常不会单独工作。如果无法获得正确有效的值对等,那么让每个属性都线程安全是没有帮助的。更合适的方法是使整个内容不可变,并让调用者获得一个快照:

public class ManyProperties
{
    private readonly string _personName;
    public string PersonName { get { return _personName; } }

    private readonly decimal? _beginAmount;
    public decimal? BeginAmount { get { return _beginAmount; } }

    public ManyProperties(string personName, string decimal? beginAmount) {
       _personName = personName;
       _beginAmount = beginAmount;
    }
}
然后:

这些将始终保持一致。另外还有零锁。读取/更新引用也总是原子性的,因此没有被破坏的值

重要的是不要做:

var name = whatever.Properties.PersonName;
...
var amount = whatever.Properties.BeginAmount;

因为这里不再保证
name
amount
来自同一
manyproperty
实例:可能有人在两次获取之间交换了引用。

请阅读并编辑您的问题,以便更清楚地了解您试图实现的目标。为了获得更好的性能,您可以使用ReaderWriterLockSlim和每个属性的不同锁定对象
var name = whatever.Properties.PersonName;
...
var amount = whatever.Properties.BeginAmount;