c# - 跟踪状态参数是什么

标签 c# design-patterns flags states

我正在重构我的前任创建的软件。该软件可以通过 CAN 总线进行通信。目前所有设备都硬编码在软件中,我的工作是让每个设备类型都可配置。 (保存在序列化类中并可使用模型创建器创建)。 使用该软件,可以对设备进行配置、寻址和参数设置。

目前,它使用在 uint 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();
}

当这个时间过长时,会给出超时异常。这目前按预期工作。

问题是,是否有不使用枚举标志来跟踪这一点的替代方案,因为新情况有多个灵活的标志。

我没有超时问题,用另一个系统替换枚举标志更像是一个架构问题。

最佳答案

也许我自己有解决方案:

我添加了一个名为 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();
    }
}

非常感谢您的意见!

关于c# - 跟踪状态参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30886856/

相关文章:

javascript - 将标志从 PHP 发送到 JavaScript

c++ - 分隔参数时 "|"(垂直线)运算符的确切功能是什么

c# - 如果用户在hangman c#中猜测正确,如何显示用户的输入

c# - 什么是 Visual Studio SDK 中 VirtualSnapshotSpan 中的虚拟空间

java - 通过扩展组合两个接口(interface)或将接口(interface)强制转换为其实现类型更好的做法是什么?

c++ - 像交互式 shell 一样设计 python

ruby-on-rails - 在 Rails 3 中保存之前操作表单数据的最佳做法是什么?

go - 将命令行字符串解析为 Golang 中的标志和参数

c# - 如何在 asp.net 中的数据列表之间添加分隔符?

c# - 为网站使用静态 ADO.NET 函数不好吗?