我尝试在以下代码中传递多个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;
}
答案 0 :(得分:0)
我认为在您的第一个代码中,x ++是在调用tmer函数之前执行的。 因此,调用tmer函数时使用2作为x的值。
答案 1 :(得分:0)
你得到了结果2,2因为触发了经过事件时执行tmer(sender, e, x)
并且那一刻的x值是2。
答案 2 :(得分:0)
关于第一个计时器,当触发Elapsed事件时,x = 2,并且这被捕获。
尝试将x复制到仅存在于lambda范围内的变量中,并改为使用副本。