跟踪状态参数

时间:2015-06-17 08:57:52

标签: c# design-patterns flags states

我正在重构由我的前任创建的软件。该软件可以通过can-bus进行通信。此时所有设备都在软件中进行硬编码,我的工作是使每个设备类型都可配置。 (保存在序列化类中,并使用模型创建者创建)。 使用该软件,可以配置,寻址和参数设置。

目前,它会跟踪在uints paramsRequested和paramsUpdated中设置的标记枚举的消息。但这需要用其他东西代替。因为这不可扩展和可配置。

枚举示例:

public enum FunctionParameters : uint
{
    None = 0,
    StatusInterval = 1 << 0,
    Delay = 1 << 1,
    Time = 1 << 2,
    .....
}

通过can-bus发送消息,并在回复时异步等待。

当消息进来时:

_paramsUpdated |= (uint) FunctionParameters.StatusInterval;  

另一个线程等到消息到达,使用它并检查参数是否被接收。

while (((uint)_paramsUpdated & (uint)param) == 0)
{
    // Do nothing
    Thread.Sleep(threadSleepTimeMS);
    //Thread.Yield();
}

当这需要太长时间时,它会给出超时异常。这目前正如预期的那样。

问题是,有没有替代品不能使用枚举标记来跟踪这一点,因为新情况有多个灵活的标记。

我没有超时问题,用其他系统替换枚举标记更是一个架构问题。

1 个答案:

答案 0 :(得分:1)

我自己可能有解决方案:

我添加了一个名为ParameterFlag的类;这看起来像这样:

    public class ParameterFlag
    {
        public ParameterFlag(ParameterType parameterType, bool flag)
        {           
            ParameterType = parameterType;
            Flag = flag;
        }

        public ParameterType ParameterType
        {
            get;
            set;
        }

        public bool Flag
        {
            get;
            set;
        }
    }

_paramsUpdated将成为:

    List<ParameterFlag> _paramsUpdated

当收到消息时:

    ParameterFlag flag =_paramsUpdated.Find(x=> x.ParameterType == ParameterType);
    flag.Flag = true;

另一个线程等到消息到达,使用它并检查参数是否被接收:

private void WaitParameterReceived(ParameterType param)
{
    while (!_paramsUpdated.Find(x => x.ParameterType == param).Flag)
    {
       // Do nothing
       Thread.Sleep(threadSleepTimeMS);
       //Thread.Yield();
    }
}

非常感谢您的评论!