我写了一个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.   

    楼主的写法太绕人:
    闭包的问题。
    下面这个可以:
     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);
            }
      

  2.   

    或者: 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)
                    {
                        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());
            }
      

  3.   

    问开发环境 是想用lambda表达式写。
      

  4.   

    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++)
                {
                    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早就自加了三次...