线程安全和在C#中引发事件的简短方法

时间:2016-11-14 05:50:33

标签: c# multithreading events properties thread-safety

这是一个场景,我有大约50个全局变量,一个UDP侦听器(在它自己的线程中工作)在收到新包时更改它们。

另一个线程(除了main之外)定期(每秒24次)读取所有这些变量,并更改一些UI元素。

正如您可能想象的那样,这是一种非常笨拙的方式。另外,我很确定,有时候我有竞争条件。所以它也不是线程安全的。

因此,我决定使用附加到属性的事件,这些事件会在发生更改时立即触发。经过一番搜索,我发现了这个:

public class MyClass : INotifyPropertyChanged
{
private object _lock;

public int MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        lock(_lock)
        {
            //The property changed event will get fired whenever
            //the value changes. The subscriber will do work if the value is
            //1. This way you can keep your business logic outside of the                   
            setter
            if(value != _myProperty)
            {
                _myProperty = value;
                NotifyPropertyChanged("MyProperty");
            }
        }
    }
}

private NotifyPropertyChanged(string propertyName)
{
    //Raise PropertyChanged event
}
public event PropertyChangedEventHandler PropertyChanged;
}


public class MySubscriber
{
private MyClass _myClass;        

void PropertyChangedInMyClass(object sender, PropertyChangedEventArgs e)
{
    switch(e.PropertyName)
    {
        case "MyProperty":
            DoWorkOnMyProperty(_myClass.MyProperty);
            break;
    }
}

void DoWorkOnMyProperty(int newValue)
{
    if(newValue == 1)
    {
         //DO WORK HERE
    }
}
}

我从"Daniel Sandberg"得到的。我很确定这段代码可以满足我的需求。 事实是,对50个属性应用该代码并不感觉像是正确的OOP。是否有更简单的方法来引发事件?

回到ActionScript时代,可以用一行代码引发这种事件。 C#的事件系统从来没有对我有意义......

1 个答案:

答案 0 :(得分:0)

为每个属性提升属性更改事件没有任何问题。这仍然与OOP一致。

为了更好的代码管理,我建议使用T4 Text Template。如果您对此不熟悉,那么它是Microsoft的文本模板,允许您为代码编写模板。

在我之前的工作中,我们将其与MVVMCross Framework一起使用。目标是只在模板中添加属性名称,它应该自动为您创建所有基本必需的东西。此外,文本模板通常用于部分类,因此您可以将其他必要的代码添加到单独的文件中,因为文本模板生成的代码是绝对的。每当代码构建发生时,都会覆盖对生成的文件的手动修改。

注意:学习曲线有点陡峭,但它确实可以帮助您保持清晰的代码。