Как узнать, завершено ли обновление по событию - PullRequest
0 голосов
/ 12 января 2010

У меня есть класс, подобный следующему:

public delegate void FanChangedEventHandler(Fan sender, EventArgs e);

public class Fan: BindableProperty
{   
    #region Blade parameters
    //These Parameters apply to individual blades but are the same for each blade.

    private double length;
    public double Length
    {
        get
        {
            return length;
        }
        set
        {
            length = value;
            NotifyPropertyChanged("Length");
            OnFanChanged(EventArgs.Empty);
        }
    }

    #endregion

    #region Preliminary Fan Outputs
    public double thrust
    {
        get
        {
            return GetThrust();
        }
    }
    private double GetThrust()
    {
        double ThrustSum = 0;
        for(int i = 0; i < Blades.count; i++)
        {
              ThrustSum += Blades[i].Thrust;
        }

        return ThrustSum;
    }
    #endregion

    #region Final Fan Outputs
    public double FinalThrust
    {
        get
        {
            return GetFinalThrust();
        }
    }
    private double GetFinalThrust()
    {
        double TotalWind = 0;
        for(int i = 0; i < Winds.count;i++)
        {
             TotalWind += Winds[i];
        }

        return Thrust + TotalWind;
    }
    #endregion

    private List<Blade> blades;
    public List<Blade> Blades
    {
        get
        {
            return blades;
        }
        set
        {
            blades = value;
            NotifyPropertyChanged("Blades");
        }
    }

    private List<Wind> winds;
    public List<Wind> Winds
    {
        get
        {
            return winds;
        }
        set
        {
            winds = value;
            NotifyPropertyChanged("Winds");
        }
    }

    public event FanChangedEventHandler FanChanged;
    protected virtual void OnFanChanged(EventArgs e)
    {
        try
        {
            UpdateProperties();

            //This seems verbose, but it is important.
            //http://blogs.msdn.com/csharpfaq/archive/2004/03/19/93082.aspx
            FanChangedEventHandler handler = FanChanged;

            if (handler != null)
                handler(this, e);
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }

    public Fan()
    {
        Length = 21.75;

        Blades = new List<Blade>();
        for (int i = 0; i < 5; i++)
        {
            Blades.Add(new Blade(this));
            Blades[i].BladeChanged += new BladeChangedEventHandler(Blade_Changed);
        }

        Winds = new List<Wind>();
        for (int i = 0; i < 3; i++)
        {
            Winds.Add(new Wind());
            RegisterWind(Winds[i]);
        }
    }

    public void RegisterWind(Wind wind)
    {
        wind.WindChanged += new WindChangedEventHandler(Wind_Changed);
    }

    private void Blade_Changed(Blade sender, EventArgs e)
    {
        UpdateProperties();
    }

    private void Wind_Changed(Wind sender, EventArgs e)
    {
        UpdateProperties();
    }

    private void UpdateProperties()
    {
            NotifyPropertyChanged("Thrust");
            NotifyPropertyChanged("FinalThrust");
    }
}

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

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

Другое: я не уверен, что FinalThrust всегда будет рассчитываться в правильном порядке. Сначала должны обновиться Лезвия, затем должна быть обновлена ​​тяга и ветер, и после этого можно рассчитать finalThrust. (Я проверил результаты моего реального класса, и они сейчас верны, но я не знаю, может ли это привести к ошибкам в будущем)

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

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

Я определенно больше инженер, чем программист! спасибо за помощь :)

1 Ответ

0 голосов
/ 12 января 2010

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

Это, в свою очередь, запускает событие, на которое подписывается обновление FinalThrust. Опять же, если для этого требуются другие предварительные условия, он может установить флаг, и обновление происходит только тогда, когда установлены все флаги.

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

...