C# 在C语言中轮询多个设备的最有效方法#

C# 在C语言中轮询多个设备的最有效方法#,c#,.net,multithreading,task-parallel-library,polling,C#,.net,Multithreading,Task Parallel Library,Polling,关于这个话题我读了很多,但仍然不知道该怎么办 首先,情况是:我有一个用C#编写的软件,它使用.NET 4.5在CAN网络上轮询多达64台设备,我使用设备制造商提供的第三方API通过USB与之通信。其目的是为用户提供温度、压力和其他值的实时更新,如来自某些传感器的值 目前,我为每个运行while循环的设备创建一个System.Threading.Thread,该循环查询设备的相关信息,通过Entity Framework将更新保存到SQL Server,然后休眠1.25秒 这在具有约20台或更少设

关于这个话题我读了很多,但仍然不知道该怎么办

首先,情况是:我有一个用C#编写的软件,它使用.NET 4.5在CAN网络上轮询多达64台设备,我使用设备制造商提供的第三方API通过USB与之通信。其目的是为用户提供温度、压力和其他值的实时更新,如来自某些传感器的值

目前,我为每个运行while循环的设备创建一个System.Threading.Thread,该循环查询设备的相关信息,通过Entity Framework将更新保存到SQL Server,然后休眠1.25秒

这在具有约20台或更少设备的较小系统上运行正常,但在具有50多台设备的大型安装上运行非常缓慢。我认为我的问题是创建这么多线程的开销。我被一个蹩脚的Atom处理器困住了,这并没有什么帮助,尽管至少这个是四核的,不像我以前使用的双核系统

所以,我一直在努力提高流程的效率。我读到的所有内容似乎都指向Task.Run()是执行类似操作的更有效的方法,但该软件可能一次运行数周或数月,我认为这意味着我需要使用TaskCreationOptions.longlunning来运行它。但我在这方面读到了相互矛盾的东西,所以我不确定。但如果是这样的话,那么我的理解是TPL无论如何只会启动一个新的专用线程,所以这似乎仍然会有我试图避免的开销

所以,正如你所看到的,我对这个话题很迷茫。我不知道我是否应该尝试一下Task.Run(),看看会发生什么,或者是否有完全不同的方法来完成这项任务

任何帮助都将不胜感激


谢谢。

您可以使用一个。为每个设备创建一个计时器,配置它并在回调中完成工作。回调将在线程池线程上执行。我认为计时器的开销较小,因为它不会旋转新线程,而是使用线程池中可用的线程?此外,是否存在垃圾收集问题的风险?如果它运行这么长时间,我是否需要调用GC.KeepAlive()或任何东西?垃圾收集器只收集不再被任何东西引用的对象。因此,只要变量不超出范围(或将其设置为
null
),它们指向的对象就不会被垃圾收集。最好的方法是使用USB接收事件而不是计时器。使每个64串行端口成为同一类的实例,这样就不必重复代码。然后创建一个包含所有端口类的设备列表(),问题是,我使用的API不提供事件,轮询是我唯一的选择。我必须调用var temperatureValue=\u apiObject.GetCurrentTemperature(\u currentChannelNumber);每次我想从传感器获取信息时。这就是我必须投票的原因。同时,我要感谢大家迄今为止的帮助。