如何知道事件驱动的更新是否完整

时间:2010-01-12 18:14:38

标签: events updatemodel

我有一个类似于以下的类:

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是否总是以正确的顺序计算。首先刀锋必须更新,然后推力和风必须更新,然后可以计算最终的推力。 (我已经检查了我的实际课程的结果,他们现在是正确的,但我不知道这是否会导致将来出现错误)

最后,我想优化Fan,这意味着将它放入循环中。如何判断所有更新是否完整,以便检查输出值并进行下一次优化迭代?

我在提出问题之前已经提出了问题,答案是我应该创建一个状态机,但我不知道如何将状态机合并到这个中。

我绝对比程序员更有工程师!感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您可以从长度更新中触发事件。这可能会增加一个计数器,当它击中5时(或者风扇上有多个刀片)更新风扇。

这反过来会触发FinalThrust更新订阅的事件。如果这需要其他前提条件,它可以设置一个标志,只有在设置了所有标志时才会发生更新。

您可以继续此链接从最终链接中触发事件,以指示一切都已完成,并且可以开始下一次迭代。