这是一个场景,我有大约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#的事件系统从来没有对我有意义......
答案 0 :(得分:0)
为每个属性提升属性更改事件没有任何问题。这仍然与OOP一致。
为了更好的代码管理,我建议使用T4 Text Template。如果您对此不熟悉,那么它是Microsoft的文本模板,允许您为代码编写模板。
在我之前的工作中,我们将其与MVVMCross Framework一起使用。目标是只在模板中添加属性名称,它应该自动为您创建所有基本必需的东西。此外,文本模板通常用于部分类,因此您可以将其他必要的代码添加到单独的文件中,因为文本模板生成的代码是绝对的。每当代码构建发生时,都会覆盖对生成的文件的手动修改。
注意:学习曲线有点陡峭,但它确实可以帮助您保持清晰的代码。