我有一个类似于以下的类:
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,这意味着将它放入循环中。如何判断所有更新是否完整,以便检查输出值并进行下一次优化迭代?
我在提出问题之前已经提出了问题,答案是我应该创建一个状态机,但我不知道如何将状态机合并到这个中。
我绝对比程序员更有工程师!感谢您的帮助:)
答案 0 :(得分:0)
您可以从长度更新中触发事件。这可能会增加一个计数器,当它击中5时(或者风扇上有多个刀片)更新风扇。
这反过来会触发FinalThrust更新订阅的事件。如果这需要其他前提条件,它可以设置一个标志,只有在设置了所有标志时才会发生更新。
您可以继续此链接从最终链接中触发事件,以指示一切都已完成,并且可以开始下一次迭代。