C#:将参数传递给多个System.Timer.Timer,当参数更改时,所有计时器都会更改
我试图在下面的代码中传递参数multiple System.Timers.Timer,并期望结果是由“1”和“2”组成的序列。但结果是“2,2,2…” 然后我将代码修改为下面的代码,然后我开始工作。谁能给我解释一下吗。非常感谢C#:将参数传递给多个System.Timer.Timer,当参数更改时,所有计时器都会更改,c#,timer,C#,Timer,我试图在下面的代码中传递参数multiple System.Timers.Timer,并期望结果是由“1”和“2”组成的序列。但结果是“2,2,2…” 然后我将代码修改为下面的代码,然后我开始工作。谁能给我解释一下吗。非常感谢 private static void tmer(object sender, EventArgs e, int i) { Console.WriteLine(i + " called."); } public static
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;
}
我认为在您的第一个代码中,x++是在调用tmer函数之前执行的。
因此,使用2作为x的值来调用tmer函数。您得到了结果2,2,因为当触发经过的事件时,执行
tmer(sender,e,x)
,此时x的值为2。关于第一个计时器,当触发经过的事件时,x=2,这被捕获
尝试将x复制到一个仅存在于lambda范围内的变量中,并使用该副本。实际上,它与计时器无关。lambda捕获变量,而不是创建lambda时恰好包含的值。
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;
}