2017-09-21 60 views
-1

我有几台设备每分钟发送一次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

我们不能告诉你如何修复我们不能看到的代码。 – Plutonix

+0

好吧我马上编辑 – Vallo

+0

编辑,应该更清楚 – Vallo

回答

0

这是因为传递到Elapsed的lambda从for循环关闭了i。这意味着定时器的回调使用最后一个值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(); 
    } 
}