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

本文关键字:事件 方法 线程 安全 | 更新日期: 2023-09-27 18:17:49

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

另一个线程(除了主线程)周期性地(每秒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#的事件系统对我来说从来没有多大意义....

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

为每个属性引发property changed事件并没有错。这仍然是与OOP一致的。

为了更好的代码管理,我建议使用T4文本模板。如果你不熟悉这个,它是微软的文本模板,它允许你为你的代码编写一个模板。

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

注意:学习曲线有点陡峭,但它确实可以帮助您维护更干净的代码。