在 c# 中为具有不同间隔的设备编写轮询服务的方法应该是什么

What should be the approach for writing polling service in c# for devices with varying interval

我有近 400 个带 Modbus 接口的 PLC 设备,我想轮询并将结果存储在 MySQL 数据库中。用户将为每个设备配置轮询间隔,例如 500 毫秒的温度轮询、1000 毫秒的三角波轮询、5000 毫秒的环境参数等。我已将所有这些信息存储在数据库中。

现在我想编写一个 windows 服务,它将执行以下操作:

  1. 从数据库中读取每个设备的通信参数,如IP地址、寄存器地址、寄存器数等
  2. 以特定间隔为每个设备启动一个线程
  3. 该线程将继续轮询设备并将值写入数据库,直到服务停止。

现在,我的问题是如何为具有特定间隔的每个设备实现单独的线程。

我正在使用带有 nModbus 库的 C#。

关于如何按时间间隔进行轮询的资源很多。 C# 4.0 - Threads on an Interval 您可以枚举一组已配置的计时器间隔和每个线程的自旋。

有那么多并发线程,我建议将它们排队。无论您是使用队列产品(如 MSMQ)还是自定义滚动某种线程安全并发字典来处理队列。这是有关自定义排队的一项资源:http://www.nullskull.com/a/1464/producerconsumer-queue-and-blockingcollection-in-c-40.aspx

希望这能让您朝着正确的方向前进。

你可以使用简单的System.Timers.Timer class; 这是示例代码

class Program
{
    static void Main(string[] args)
    {
        // Timer interval in ms
        // in your case read from database
        double timerIntervalInMs = 1000.00;
        var myTimer = new Timer(timerIntervalInMs);
        // I generally prefer to use AutoReset false 
        // and explicitly start the timer within the elapsed event.
        // Thus you can ensure that there will not be overlapping elapsed events.
        myTimer.AutoReset = false;
        myTimer.Elapsed += OnMyTimedEvent;
        myTimer.Enabled = true;
        myTimer.Start();
        Console.ReadLine();

    }

    private static void OnMyTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("On timer event");
        // Do work
        var timerObj = (Timer) source;
        timerObj.Start();
    }

}