我有近400台带有Modbus接口的PLC设备,我想轮询并将结果存储在MySQL数据库中。用户将为每个设备配置轮询间隔,例如温度轮询为500毫秒,三角波为1000毫秒,环境参数为5000毫秒等。我已将所有这些信息存储在数据库中。
现在我想编写一个Windows服务,它将执行以下操作:
现在,我的问题是如何为每个设备实现具有特定间隔的单独线程。
我正在使用带有nModbus库的C#。
答案 0 :(得分:0)
有很多关于如何在一个间隔上进行轮询的资源。 C# 4.0 - Threads on an Interval您可以枚举已配置的计时器间隔的集合,并为每个间隔旋转一个线程。
有了这么多并发线程,我建议排队这些。无论您是使用队列产品(如MSMQ)还是自定义滚动某种线程安全并发字典来处理排队。以下是自定义排队的一个资源:http://www.nullskull.com/a/1464/producerconsumer-queue-and-blockingcollection-in-c-40.aspx
希望这会让你朝着正确的方向前进。
答案 1 :(得分:0)
您可以使用简单的System.Timers.Timer类; 这是示例代码
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();
}
}