使用信号量或锁在c#中使属性线程安全?

使用信号量或锁在c#中使属性线程安全?,c#,multithreading,locking,system.reactive,semaphore,C#,Multithreading,Locking,System.reactive,Semaphore,我对反应式很陌生,但这个想法激发了我的好奇心,所以我做了一点反应式变量,但我不知道这是否是最佳实践,然后我会让这个线程安全 下面是课程: public class RxVar<T>:IObservable<T> { T _value; public T Value { get{ return _value; } set{ if

我对反应式很陌生,但这个想法激发了我的好奇心,所以我做了一点反应式变量,但我不知道这是否是最佳实践,然后我会让这个线程安全

下面是课程:

 public class RxVar<T>:IObservable<T>
 {

     T _value;
     public T Value
     {

         get{ 
             return _value;
         }
         set{
             if (!_value.Equals(value))
             {
                 onChange(_value);
                 _value = value;
             }
         }

     }


     event onValChange onChange = delegate { };
     delegate void onValChange(T val);

     IObservable<T> _observable;
     public RxVar() {

         _observable = Observable.FromEvent<onValChange,T>(ev => onChange += ev, ev => onChange -= ev);
     }

     public IDisposable Subscribe(IObserver<T> observer)
     {
         return _observable.Subscribe(p=>observer.OnNext(p));
     }
 }
好的,我想让这个线程安全,我害怕死锁。所以 最好使用
lock
或信号量,或者由于其反应性,是否不需要它


谢谢。:)

我建议使用锁而不是信号灯。对于这种情况,信号量是错误的工具

考虑使用“return\u value”公开实际值意味着即使在getter返回之后,客户机代码也能够修改对象中的数据。所以问题是,在你暴露了参考资料之后,你将如何避免种族冲突

答案是不要暴露引用。给出对象/数据的深度副本,而不是原始对象本身

关于僵局:如果你知道自己在做什么,你不应该害怕。如果不这样做,就无法判断死锁是否永远不会存在,因为每次运行时的条件可能会有所不同,即使在许多成功的测试之后,您也可能会导致死锁,调试这将是一项困难的任务

死锁只能通过事先研究来避免,而不是通过任何“不知道就编程”的方式

带锁的小代码段:

类实例字段(如果_值可以为null,则需要此字段,否则可以锁定_值本身):

在您的方法中:

lock(_valueLock)
{
    if (_value != value) // this or deep equality
    {
        _value = value;
        onChange(this, _value); // for complex Observer-Observable scenarios it's better specifying the observed object
    }
}

真的非常感谢,不管怎样,我不明白为什么信号手机不能做这项工作:)信号灯最适合其他场景,如或。这种情况很简单,因此可能有更干净的代码和更高效的实现。
private object _valueLock = new Int(0);
lock(_valueLock)
{
    if (_value != value) // this or deep equality
    {
        _value = value;
        onChange(this, _value); // for complex Observer-Observable scenarios it's better specifying the observed object
    }
}