在 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 服务,它将执行以下操作:
- 从数据库中读取每个设备的通信参数,如IP地址、寄存器地址、寄存器数等
- 以特定间隔为每个设备启动一个线程
- 该线程将继续轮询设备并将值写入数据库,直到服务停止。
现在,我的问题是如何为具有特定间隔的每个设备实现单独的线程。
我正在使用带有 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();
}
}
我有近 400 个带 Modbus 接口的 PLC 设备,我想轮询并将结果存储在 MySQL 数据库中。用户将为每个设备配置轮询间隔,例如 500 毫秒的温度轮询、1000 毫秒的三角波轮询、5000 毫秒的环境参数等。我已将所有这些信息存储在数据库中。
现在我想编写一个 windows 服务,它将执行以下操作:
- 从数据库中读取每个设备的通信参数,如IP地址、寄存器地址、寄存器数等
- 以特定间隔为每个设备启动一个线程
- 该线程将继续轮询设备并将值写入数据库,直到服务停止。
现在,我的问题是如何为具有特定间隔的每个设备实现单独的线程。
我正在使用带有 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();
}
}