C# 防止设备通信中的瓶颈

C# 防止设备通信中的瓶颈,c#,.net,multithreading,performance,C#,.net,Multithreading,Performance,我有一个相当抽象的问题。我正在做一个需要持续设备通信的项目。我将多个设备集成到带有触摸面板的外部处理单元上,以执行某些方法。即,触摸面板上的“启动视频通话”按钮激活继电器,打开显示设备、摄像头设备和麦克风设备等 另一方面,我也在尝试监控这些设备。他们目前的状况如何?它们是否已启用/禁用?显示设备当前打开的是什么输入 到目前为止,我已经提出了两种解决方案,以防止通信中出现瓶颈,在这种情况下,我会不断轮询(即每两到五秒轮询一次,以保持准确和最新的状态)显示设备的打开状态和输入状态 利用线程技术,使不

我有一个相当抽象的问题。我正在做一个需要持续设备通信的项目。我将多个设备集成到带有触摸面板的外部处理单元上,以执行某些方法。即,触摸面板上的“启动视频通话”按钮激活继电器,打开显示设备、摄像头设备和麦克风设备等

另一方面,我也在尝试监控这些设备。他们目前的状况如何?它们是否已启用/禁用?显示设备当前打开的是什么输入

到目前为止,我已经提出了两种解决方案,以防止通信中出现瓶颈,在这种情况下,我会不断轮询(即每两到五秒轮询一次,以保持准确和最新的状态)显示设备的打开状态和输入状态

  • 利用线程技术,使不同的命令排队并异步执行。通过异步读取响应,所有通信应该间隔很好,但我会有一条非常“繁忙”的通信线路,这会对处理单元造成损失
  • 借助事件,让显示设备通知处理器其已更改的状态。这会减轻通讯线路的压力,但我觉得这很容易中断。如果设备没有正确抛出其事件(或错过事件),则监视的状态与实际状态不一致 我很好奇是否还有其他方法来解决这个问题。到目前为止,我倾向于第二个,因为它对处理单元的压力要小得多,我只是觉得我应该建立很多保护措施,以防止实际设备状态的不准确表示


    该项目在.NET3.5上的C#中运行。

    轮询是可行的,但它既不有趣也不理想。反应式是最好的,但正如您所提到的,可能会出现一个小问题,确保您仍在收听设备,而不是袖手旁观。在这种情况下,需要优化这两个过程。在等待或很久没有听到响应时进行投票,并在投票返回良好信息时进行聆听,通过投票


    也就是说,您不应该担心在不同线程上进行轮询会给单元带来太多负担。这听起来像是一个目的设备,所以只要你没有运行它热或压力,以最大限度地所有的时间,然后使用您的资源是完美的

    您好,一般来说,最抽象的形式是,事件不保证交付。另一方面我从来没有遇到过一个非由于我自己缺乏编程技能而无法交付的事件。因此,选择2将是“更好”的方式,当然,除非您遇到问题。顺便说一句:有时候你可以通过实现功能来纠正这些状态。例如:返回按钮用于恢复状态,在转换到下一个之前检查当前状态,超时机制。最后一个提示:尝试实现一个
    statemachine
    ,以防止过度的
    if/else
    连接?每当事件在一小时内未触发时,我将轮询一次,如果活动状态与监视状态相等,如果事件尚未触发,我将在一小时后再次轮询?这听起来像是一个可靠的实现。正如@Stefan已经暗示的,我之所以对事件充满怀疑是因为我对自己的编程技能没有信心。@Ciphra好吧,不要怀疑你自己或你的技能。如果你犯了一个错误,了解出了什么问题并加以纠正。但是,除非你有办法知道设备仍在连接,否则两者的混合将起作用。你基本上需要某种心跳信号,无论是内置的还是自己设计的,来告诉你设备就在那里。然后,您只需要准确地管理设备的状态。没有完美的解决方案。大多数设备都与TCPClient连接,TCPClient有一个在连接状态更改时触发的事件。这可以作为您提到的心跳。不过我还是倾向于轮询和监听的组合实现。@Ciphra你是对的,TCP内置了它,这就是我所指的。什么设备/操作系统正在初始化TCP?它是一个服务器式设备,通常被称为处理器(在这里的工作台上)。它启动程序/系统并保持其运行,除非它因错误代码而中断或您告诉它停止。设计的程序/系统大多只是集成多个设备,从单个控制面板进行控制,通常是触摸面板,但也可能是模拟控制面板。我相当肯定他们也在里面运行一个自己编写的操作系统。