Как вызвать событие при изменении значения переменной?



в настоящее время я создаю приложение на C# с помощью Visual Studio. Я хочу создать некоторый код, так что когда переменная имеет значение 1, то выполняется определенный кусок кода.
Я знаю, что могу использовать оператор if, но проблема в том, что значение будет изменено в асинхронном процессе, поэтому технически оператор if может быть проигнорирован до изменения значения.



можно ли создать обработчик событий, чтобы при изменении значения переменной событие сработало? Если да, то как я могу это сделать?



вполне возможно, что я мог неправильно понять, как работает оператор if! Любая помощь будет высоко ценится.

772   4  

4 ответов:

Мне кажется, что вы хотите создать свойство.

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

private int _myProperty;

Это позволяет запускать некоторый код в любое время изменения значения свойства. Вы могли бы устроить здесь мероприятие, если бы захотели.

вы можете использовать задатчик свойств для вызова события всякий раз, когда значение поля будет изменяться.

вы можете иметь свой собственный делегат EventHandler или вы можете использовать известную систему.Делегат EventHandler в.

обычно есть шаблон для этого:

  1. определите публичное событие с делегатом обработчика событий (который имеет аргумент типа EventArgs).
  2. определите защищенный виртуальный метод, называемый OnXXXXX (OnMyPropertyValueChanged for образец.) В этом методе вы должны проверить, является ли делегат обработчика событий null, и если нет, вы можете вызвать его (это означает, что есть один или несколько методов, присоединенных к делегированию событий).
  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();
    }
 }

преимущество этого подхода заключается в том, что вы позволяете любым другим классам, которые хотят наследовать от вашего класса, изменять поведение, если необходимый.

Если вы хотите поймать событие в другом потоке, который он вызывает, вы должны быть осторожны, чтобы не изменить состояние объектов, определенных в другом потоке, что приведет к возникновению исключения перекрестного потока. Чтобы избежать этого, вы можете использовать метод Invoke для объекта, который вы хотите изменить его состояние, чтобы убедиться, что изменение происходит в том же потоке, в котором было вызвано событие, или в случае, если вы имеете дело с формой Windows, вы можете используйте BackgourndWorker, чтобы делать вещи в параллельном потоке красиво и легко.

платформа .NET framework фактически предоставляет интерфейс, который можно использовать для уведомления подписчиков при изменении свойства: 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.
    }
  }
}

Comments

    Ничего не найдено.