You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#动态创建Terminal类实例后如何按IP匹配分发命令到对应列表

实现思路

核心问题是你当前的Principal类没有保留所有创建的Terminal实例,每次给Obj重新赋值都会把之前的实例丢弃,自然无法匹配对应的终端。我们可以用字典(Dictionary) 存储IP地址和Terminal实例的映射关系,实现O(1)效率的IP匹配查找。


第一步:先修正现有代码的语法错误

你现在的代码有几处影响编译的问题,先调整:

  1. Terminal类的Lista字段定义为List<string>,但AdicionaLista方法要添加Comando类型,类型不匹配
  2. ProcessaTimer方法中Lista.count的首字母需要大写,C#集合的长度属性是Count
  3. AdicionaLista方法里Lista.Add(comando))多了一个多余的右括号
  4. 额外补充线程安全处理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:42:01