定时器数组,在事件中包含参数

时间:2017-09-21 18:49:35

标签: c# timer

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

1 个答案:

答案 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();
    }
}