如何在variables的值发生变化时触发事件?

我目前使用Visual Studio在C#中创build一个应用程序。 我想创build一些代码,以便当一个variables的值为1,然后执行一段代码。 我知道我可以使用if语句,但问题是值将在asynchronous过程中更改,所以在技术上if语句可以在值更改之前被忽略。

是否有可能创build一个事件处理程序,以便当variables值发生变化时触发一个事件? 如果是这样,我该怎么做?

我可能误解了if语句的工作原理是完全可能的! 任何帮助将不胜感激。

在我看来,你想创造一个财产。

public int MyProperty { get { return _myProperty; } set { _myProperty = value; if (_myProperty == 1) { // DO SOMETHING HERE } } } 

这允许您在属性值更改时运行一些代码。 如果你愿意,你可以在这里举办一个活动。

只要字段的值发生变化,您就可以使用属性设置器来引发事件。

您可以拥有自己的EventHandler委托,也可以使用着名的System.EventHandler委托。

通常有这样的模式:

  1. 使用事件处理程序委托(具有EventArgstypes的参数)定义公共事件。
  2. 定义一个名为OnXXXXX的保护虚拟方法(例如OnMyPropertyValueChanged)。 在这个方法中,你应该检查事件处理程序委托是否为空,如果不是,你可以调用它(这意味着有一个或多个方法附加到事件委托)。
  3. 只要你想通知用户某些东西已经改变,就调用这个受保护的方法。

这是一个例子

 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(); } } 

这种方法的优点是你让任何其他类想要从你的类inheritance来改变行为,如果有必要的话。

如果你想在一个不同的线程中捕获一个事件,那么你必须注意不要改变另一个线程中定义的对象的状态,这会导致一个交叉线程exception的抛出。 为了避免这种情况,您可以在要更改其状态的对象上使用Invoke方法,以确保所做的更改发生在与提出事件相同的线程中,或者如果您正在处理Windows窗体可以使用BackgourndWorker在并行线程中做好事情。

.NET框架实际上提供了一个接口,当属性发生变化时,您可以使用它来通知订阅者:System.ComponentModel.INotifyPropertyChanged。 这个接口有一个事件PropertyChanged。 它通常在WPF中用于绑定,但我发现它在业务层中用作标准化属性更改通知的一种方式。

在线程安全方面,我会把一个锁放在setter下,这样你就不会遇到任何竞争条件。

这是我的代码:):

 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. } } }