我写了一个timer数组,程序执行时,三个timer事件结果都是"第3个定时器启动...";
代码如下:我想得到的结果是:“第1个定时器启动。。”,“第2个定时器启动。。”,
"第3个定时器启动..."; 求各位大虾如何修改代码。
private void button1_Click(object sender, EventArgs e)
{
SetTimer();
}
private void SetTimer()
{
System.Timers.Timer[] timer = new System.Timers.Timer[3];
for (int i = 0; i < timer.Length; i++)
{
timer[i] = new System.Timers.Timer();
timer[i].Interval = 3000;
timer[i].Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
Timers_Elapsed(sender,e,i);
};
timer[i].AutoReset = false;
timer[i].Start();
}
System.Threading.Thread.Sleep(5000);
} private static void Timers_Elapsed(object sender, System.Timers.ElapsedEventArgs e, int i)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
theTimer.Stop();
MessageBox.Show("第"+i.ToString()+"个定时器"+DateTime.Now.ToString());
}
代码如下:我想得到的结果是:“第1个定时器启动。。”,“第2个定时器启动。。”,
"第3个定时器启动..."; 求各位大虾如何修改代码。
private void button1_Click(object sender, EventArgs e)
{
SetTimer();
}
private void SetTimer()
{
System.Timers.Timer[] timer = new System.Timers.Timer[3];
for (int i = 0; i < timer.Length; i++)
{
timer[i] = new System.Timers.Timer();
timer[i].Interval = 3000;
timer[i].Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
Timers_Elapsed(sender,e,i);
};
timer[i].AutoReset = false;
timer[i].Start();
}
System.Threading.Thread.Sleep(5000);
} private static void Timers_Elapsed(object sender, System.Timers.ElapsedEventArgs e, int i)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
theTimer.Stop();
MessageBox.Show("第"+i.ToString()+"个定时器"+DateTime.Now.ToString());
}
解决方案 »
- C# 中带参数的insert语句当插入image类型为空值时报错
- 使用WMI (Win32_NetworkAdapterConfiguration)获取subnet mask的问题
- 继承自weifenluo的dockPanel的DockContent的窗口的停靠按钮怎么不显示关闭和自动隐藏按钮?
- 在线等,一个困扰很久的问题了。(顶者分)
- 在C#中如何定义一个数组的全局变量!
- winform中的DataGrid的样式设置问题?
- 添加数据库,更新数据的时候提示更新要求有效的InsertCommand错误,急死了。
- 如何保存网络图片到本地机?
- 对c#程序进行封装??
- 转让OICQ号码 6位7位8位
- jmail接收邮件乱码
- 有用mencoder做过视频转换的没,帮我看看错误。谢谢。
闭包的问题。
下面这个可以:
private void SetTimer()
{
System.Timers.Timer[] timer = new System.Timers.Timer[3];
for (int i = 0; i < timer.Length; i++)
{
timer[i] = new System.Timers.Timer();
timer[i].Interval = 3000; int __________i = i;
timer[i].Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
theTimer.Stop();
Console.WriteLine("第" + __________i.ToString() + "个定时器" + DateTime.Now.ToString());
}; timer[i].AutoReset = false;
timer[i].Start();
}
System.Threading.Thread.Sleep(5000);
}
{
System.Timers.Timer[] timer = new System.Timers.Timer[3];
for (int i = 0; i < timer.Length; i++)
{
timer[i] = new System.Timers.Timer();
timer[i].Interval = 3000; int ___________i = i;
timer[i].Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
Timers_Elapsed(sender, e, ___________i);
}; timer[i].AutoReset = false;
timer[i].Start();
}
System.Threading.Thread.Sleep(5000);
} private static void Timers_Elapsed(object sender, System.Timers.ElapsedEventArgs e, int i)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
theTimer.Stop();
Console.WriteLine("第" + i.ToString() + "个定时器" + DateTime.Now.ToString());
}
{
SetTimer();
}
private void SetTimer()
{
System.Timers.Timer[] timer = new System.Timers.Timer[3];
for (int i = 0; i < timer.Length; i++)
{
int count=i;
timer[i] = new System.Timers.Timer();
timer[i].Interval = 3000;
timer[i].Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
Timers_Elapsed(sender,e,count);
};
timer[i].AutoReset = false;
timer[i].Start();
}
System.Threading.Thread.Sleep(5000);
} private static void Timers_Elapsed(object sender, System.Timers.ElapsedEventArgs e, int i)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
theTimer.Stop();
MessageBox.Show("第"+i.ToString()+"个定时器"+DateTime.Now.ToString());
}加了一行 int count=i;
i是for以外的变量,等定时器时间到了,i早就自加了三次...