C#:将参数传递给多个System.Timers.Timer,当参数更改时,所有计时器都会更改

时间:2014-08-07 07:14:18

标签: c# timer

我尝试在以下代码中传递多个System.Timers.Timer参数,并期望结果是由" 1"组成的序列。和" 2"。但结果结果是" 2,2,2 ..."。

    private static void tmer(object sender, EventArgs e, int i)
    {
        Console.WriteLine(i);
    }
    public static void Main(string[] args)
    {
        int x = 1;
        Timer tm1 = new Timer(1000);
        tm1.Elapsed += (sender, e) => tmer(sender, e, x);
        tm1.Enabled = true;

        x++;
        Timer tm2 = new Timer(1000);
        tm2.Elapsed += (sender, e) => tmer(sender, e, x);
        tm2.Enabled = true;
    }

然后我将我的代码修改为以下代码并且我工作了。任何人都可以向我解释一下。非常感谢。

    private static void tmer(object sender, EventArgs e, int i)
    {
        Console.WriteLine(i + " called.");
    }
    public static void Main(string[] args)
    {
        int x = 1;
        Timer tm1 = new Timer(1000);
        tm1.Elapsed += (sender, e) => tmer(sender, e, x);
        tm1.Enabled = true;

        Timer tm2 = new Timer(1000);
        tm2.Elapsed += (sender, e) => tmer(sender, e, 2);
        tm2.Enabled = true;
    }

3 个答案:

答案 0 :(得分:0)

我认为在您的第一个代码中,x ++是在调用tmer函数之前执行的。 因此,调用tmer函数时使用2作为x的值。

答案 1 :(得分:0)

你得到了结果2,2因为触发了经过事件时执行tmer(sender, e, x)并且那一刻的x值是2。

答案 2 :(得分:0)

关于第一个计时器,当触发Elapsed事件时,x = 2,并且这被捕获。

尝试将x复制到仅存在于lambda范围内的变量中,并改为使用副本。