我有几台设备每分钟发送一条TCP或POST消息。每当设备在一小时后停止发送消息时,我需要发出警报。
我想为每个设备创建一个Timer,并在收到消息时重新启动它。如果事件触发,请使用与计时器关联的设备的相应ID调用方法并生成警报。
问题在于我无法找到将固定参数传递给定时器的方法。我尝试的每个方法都以某种方式为每个计时器替换所选参数。
有更好的方法吗?或者将参数传递给计时器的已用事件的正确方法是什么?
谢谢,
编辑:
此代码始终打印5,我需要它打印1 2 3 4 5(不重要的顺序)
private Timer[] timers = new Timer[5];
private void button6_Click(object sendera, EventArgs ee)
{
for (int i = 0; i < timers.Length; i++)
{
timers[i] = new Timer(1000);
timers[i].Elapsed += (sender, e) => { HandleTimerElapsed(i); };
timers[i].Start();
}
}
static void HandleTimerElapsed(int i)
{
Console.WriteLine(i);
}
答案 0 :(得分:1)
这是因为传递给Elapsed
的lambda从i
循环结束for
。这意味着计时器的回调使用i
的最后一个值,在该特定情况下为5
。你可以通过在循环中声明一个额外的变量来绕过它:
private void button6_Click(object sendera, EventArgs ee)
{
for (int i = 0; i < timers.Length; i++)
{
int temp = i;
timers[temp] = new Timer(1000);
timers[temp].Elapsed += (sender, e) => { HandleTimerElapsed(temp); };
timers[temp].Start();
}
}