在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#的事件系统对我来说从来没有多大意义....
为每个属性引发property changed事件并没有错。这仍然是与OOP一致的。
为了更好的代码管理,我建议使用T4文本模板。如果你不熟悉这个,它是微软的文本模板,它允许你为你的代码编写一个模板。
在我之前的工作中,我们将其与MVVMCross框架一起使用。目标是在模板中添加属性名,它应该自动为您创建所有必要的基本内容。此外,文本模板通常用于部分类,因此您可以在单独的文件中添加其他必要的代码,因为文本模板生成的代码是绝对的。无论何时生成代码,都会覆盖对生成文件的手动修改。
注意:学习曲线有点陡峭,但它确实可以帮助您维护更干净的代码。