C#动态创建Terminal类实例后如何按IP匹配分发命令到对应列表
实现思路
核心问题是你当前的Principal类没有保留所有创建的Terminal实例,每次给Obj重新赋值都会把之前的实例丢弃,自然无法匹配对应的终端。我们可以用字典(Dictionary) 存储IP地址和Terminal实例的映射关系,实现O(1)效率的IP匹配查找。
第一步:先修正现有代码的语法错误
你现在的代码有几处影响编译的问题,先调整:
Terminal类的Lista字段定义为List<string>,但AdicionaLista方法要添加Comando类型,类型不匹配ProcessaTimer方法中Lista.count的首字母需要大写,C#集合的长度属性是CountAdicionaLista方法里Lista.Add(comando))多了一个多余的右括号- 额外补充线程安全处理:
System.Timers.Timer的Elapsed事件在后台线程触发,读写Lista需要加锁避免并发冲突
修正后的Terminal类:
public class Terminal { public string Endereco { get; set; } // 修正类型为List<Comando> List<Comando> Lista = new List<Comando>(); System.Timers.Timer timer; // 锁对象保证线程安全 private readonly object _lockObj = new object(); public Terminal() { this.timer = new System.Timers.Timer(); this.timer.Interval = 500; this.timer.Enabled = true; this.timer.Elapsed += ProcessaTimer; } private void ProcessaTimer(object sender, System.Timers.ElapsedEventArgs e) { lock(_lockObj) { if (Lista.Count > 0) ProcessaLista(); } } public void ProcessaLista() { //Send command to device } public void AdicionaLista(Comando comando) { lock(_lockObj) { Lista.Add(comando); } } }
第二步:改造Principal类实现IP匹配
新增字典字段存储所有Terminal实例,构造函数中创建实例时存入字典,RecebeDados方法直接通过IP查找对应实例即可:
public class Principal { // 存储IP地址到Terminal实例的映射 private readonly Dictionary<string, Terminal> _terminalMap = new Dictionary<string, Terminal>(); public Principal() { // 每次创建实例后存入字典 Terminal obj = new Terminal(); obj.Endereco = "192.168.0.100"; _terminalMap.Add(obj.Endereco, obj); obj = new Terminal(); obj.Endereco = "192.168.0.200"; _terminalMap.Add(obj.Endereco, obj); obj = new Terminal(); obj.Endereco = "192.168.0.300"; _terminalMap.Add(obj.Endereco, obj); } void RecebeDados(Comando comando) { // 尝试查找对应IP的Terminal实例 if (_terminalMap.TryGetValue(comando.Endereco, out var terminal)) { // 找到就把命令添加到对应实例的列表 terminal.AdicionaLista(comando); } // 没找到对应终端可以按需补充异常处理、日志记录逻辑 } }
额外说明
如果需要动态新增/删除Terminal实例,直接操作_terminalMap字典的Add/Remove方法即可,无需修改RecebeDados的逻辑。如果IP地址匹配需要忽略大小写,可以在初始化字典时指定StringComparer.OrdinalIgnoreCase作为比较器。
内容的提问来源于stack exchange,提问作者Nádia Teles
相关产品推荐
相关产品推荐

