我目前正在使用Visual Studio在C#中创建一个应用程序。我想创建一些代码,以便当变量的值为1时,便执行了一段代码。我知道我可以使用if语句,但是问题是该值将在异步过程中更改,因此从技术上讲,可以在更改值之前忽略if语句。
是否可以创建事件处理程序,以便在变量值更改时触发事件?如果是这样,我该怎么做?
我完全有可能误解了if语句的工作原理!任何帮助将非常感激。
我目前正在使用Visual Studio在C#中创建一个应用程序。我想创建一些代码,以便当变量的值为1时,便执行了一段代码。我知道我可以使用if语句,但是问题是该值将在异步过程中更改,因此从技术上讲,可以在更改值之前忽略if语句。
是否可以创建事件处理程序,以便在变量值更改时触发事件?如果是这样,我该怎么做?
我完全有可能误解了if语句的工作原理!任何帮助将非常感激。
Answers:
每当字段的值要更改时,都可以使用属性设置器引发事件。
您可以拥有自己的EventHandler委托,也可以使用著名的System.EventHandler委托。
通常有一种模式:
这是一个例子
private int _age;
//#1
public event System.EventHandler AgeChanged;
//#2
protected virtual void OnAgeChanged()
{
if (AgeChanged != null) AgeChanged(this,EventArgs.Empty);
}
public int Age
{
get
{
return _age;
}
set
{
//#3
_age=value;
OnAgeChanged();
}
}
这种方法的优点是,如果需要,可以让要从您的类继承的其他任何类更改其行为。
如果要在正在引发的其他线程中捕获事件,则必须注意不要更改在另一个线程中定义的对象的状态,这将导致引发跨线程异常。为避免这种情况,您可以在要更改其状态的对象上使用Invoke方法,以确保更改在引发事件的同一线程中进行,或者在处理Windows窗体的情况下,可以使用BackgourndWorker在并行线程中轻松而轻松地执行操作。
.NET框架实际上提供了一个接口,您可以使用该接口在属性更改时通知订户:System.ComponentModel.INotifyPropertyChanged。此接口具有一个事件PropertyChanged。它通常在WPF中用于绑定,但是我发现它在业务层中作为标准化属性更改通知的一种方式很有用。
在线程安全方面,我会在设置器中放一个锁,这样您就不会遇到任何竞争状况。
这是我在代码中的想法:):
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
}
}
}
希望这会有所帮助:)
只是使用一个属性
int _theVariable;
public int TheVariable{
get{return _theVariable;}
set{
_theVariable = value;
if ( _theVariable == 1){
//Do stuff here.
}
}
}
您可以使用通用类:
class Wrapped<T> {
private T _value;
public Action ValueChanged;
public T Value
{
get => _value;
set
{
OnValueChanged();
_value = value;
}
}
protected virtual void OnValueChanged() => ValueChanged?.Invoke() ;
}
并能够执行以下操作:
var i = new Wrapped<int>();
i.ValueChanged += () => { Console.WriteLine("changed!"); };
i.Value = 10;
i.Value = 10;
i.Value = 10;
i.Value = 10;
Console.ReadKey();
结果:
changed!
changed!
changed!
changed!
changed!
changed!
changed!