Events 如何知道事件驱动更新是否完成

Events 如何知道事件驱动更新是否完成,events,updatemodel,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 d

我的课程与以下内容类似:

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");
    }
}
因此,如果更改length参数,它将触发一个事件。此事件通知所有刀片服务器应自我更新,刀片服务器应自我更新,然后在发生更改时通知,风扇也会自我更新

我遇到了一些问题,一个是,如果我改变长度,风扇将被更新五次,而它只需要更新一次

另一个问题是,我不确定最终信任度是否总是按正确的顺序计算。首先必须更新叶片,然后必须更新推力和风,然后才能计算最终推力。我已经检查了我的实际类的结果,它们现在是正确的,但我不知道这是否会在将来导致错误

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

在这之前,我问过一些问题,答案是我应该创建一个状态机,但我不知道如何将状态机合并到其中


我绝对是工程师而不是程序员!感谢您的帮助:

您可以通过长度更新触发事件。这可能会增加一个计数器,当它达到5个或风扇上有多少叶片时,会更新风扇

这进而触发FinalTrust更新订阅的事件。同样,如果这需要其他先决条件,则可以设置一个标志,并且只有在设置了所有标志后才会进行更新

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