2016-11-14 27 views
-1

这里是场景,我有大约50个全局变量,一个UDP监听器(它在它自己的线程中工作)在它接收到新包时改变它们。线程安全和在C中提高事件的简短方式#

另一个线程(除主)周期性地(每秒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

你可以使用C#的一些AOP(面向方面​​编程)框架,例如PostSharp(免费版本应该足以满足你的需求)。在那里,您可以定义一个方面,并使用单行代码将其应用于类的所有属性,就像您想要的一样。 – Evk

+0

那么,一旦你拥有50个全球属性 - 特别是不断被读写的 - 你已经远离OOP的界限了。作为Evk提到的AOP是一种方法。您也可以将事件分派委派给您的UDP侦听器,并将其一般写入。或者你可以生成类(通过IL或模板引擎)。 – Rob

+0

@Rob我知道广泛使用全局是令人不悦的。与微控制器一起工作的坏习惯。考虑使用UDP侦听器来创建新线程来处理每个收到的包。但我不认为这会很聪明,因为我无法控制新套餐到达的频率。除非非常小心执行,否则会引起竞争状况。之前从未听说过AOP。听起来不错。我会检查它。 – flanker

回答

0

提高每个属性的属性更改事件没有任何问题。这仍然符合OOP。

为了更好的代码管理,我建议使用T4 Text Template。如果您对此不熟悉,则可以使用Microsoft的文本模板来为您的代码编写模板。

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

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