System.Timers.Timer aTimers = new System.Timers.Timer();
        /// <summary>
        /// 定时发送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDsfs_Click(object sender, EventArgs e)
        {
            
            aTimers.Interval = 300;
            aTimers.Elapsed += new ElapsedEventHandler(TimeEvent);
            aTimers.Enabled = true;
            aTimers.Start();
        }
        private void TimeEvent(object source, ElapsedEventArgs e)
        {
            int i = YBpoll();
            if (i == 0)
            {
                txtList.Text = "通讯正常!";
            }
            if (i == 1)
            {
                txtList.Text = "通讯正常!";
            }
            if (i == 11)
            {
                txtList.Text = "收到一元硬币!";
            }
            if (i == 55)
            {
                txtList.Text = "收到五角硬币!";
            }
            if (i == -1)
            {
                txtList.Text = "投币器关闭!";
            }
            if (i == -2)
            {
                txtList.Text = " 命令错误!";
            }
            if (i == -3)
            {
                txtList.Text = "被拒绝!";
            }
            if (i == -4)
            {
                txtList.Text = "通道关闭!";
            }
            if (i == -5)
            {
                txtList.Text = "其它错误!";                //Console.WriteLine(System.DateTime.Now);
                
            }
           
        }
 这个按钮让timer停下来,但总是不停
        protected void btnDsgb_Click(object sender, EventArgs e)
        {
            
            aTimers.Enabled = false;
            aTimers.Stop();
                       
            txtList.Text = "定时关闭成功!";
        }

解决方案 »

  1.   

    YBpoll();
    这个是不是一直没执行完?
      

  2.   

    是不是该先stop,再enabled=false;呢
      

  3.   

    看的晕死了,你不用case的啊?我看不出有什么问题。你点一次停止后,等一段时间看看,会不会是你的定时器时间间隔设置的太短,子程序运行好多副本,还没完全执行完毕。
      

  4.   

    aTimers.Enabled = false;
    aTimers.Stop();
    两个的效果一样,只不过后一个引发Elapsed 事件。用一个就可以了。至于为什么不停,你调试下吧,看看按了按钮程序跳到哪里。
      

  5.   

    你是不是应该用下Sleep方法呢?
      

  6.   


    protected void btnDsgb_Click(object sender, EventArgs e)
      {
       
      //aTimers.Enabled = false;
      aTimers.Stop();
       
      txtList.Text = "定时关闭成功!";
      }
      

  7.   

    还是坚持我的看法,System.Timers.Timer这个定时器,不是多线程定时器,所以多次执行start,enable= true都没关系,楼主的问题可能是一次还没执行完,所以无法停止,关键是看你那个YBpoll是不是没退出。这个例子就很好的模拟了楼主的问题。System.Timers.Timer t2 = new System.Timers.Timer();
    private void button1_Click(object sender, EventArgs e)
    {
        t2.Interval = 100;
        t2.Elapsed += t2_Elapsed;
        t2.Enabled = true;
        t2.Start();
    }private void button2_Click(object sender, EventArgs e)
    {
        t2.Stop();
    }int count = 0;
    void t2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        count++;
        System.Threading.Thread.Sleep(200);
        EventHandler eh =(s1,e1)=>{ this.Text = count.ToString(); };
        this.Invoke(eh);            
    }
      

  8.   

    同1楼的看法。YBpoll()会不会是个死循环或耗时的方法?
    另外你的代码中有两个问题
    1.aTimers.Enabled = false;和Stop()是一样的效果,用一个就可以了。
    aTimers.Start();和Enabled=true;也是一样的。
    2.if语句的写法。虽然不影响执行结果,但改成if... else if是不是好点?
    或者swicth...case,或者在每个if语句块后加上return。
      

  9.   

    你怎么知道没停下来?打断点在timer事件里看了? 我觉得应该停下来了
      

  10.   

    我还是觉得LZ多次点击了btnDsfs_Click
      

  11.   

    同样的代码B/S里停不了,C/S里能停下来,无法理解
      

  12.   

            System.Timers.Timer aTimers = new System.Timers.Timer();
            private void button1_Click(object sender, EventArgs e)
            {            aTimers.Interval = 300;
                aTimers.Elapsed += new ElapsedEventHandler(TimeEvent);
                aTimers.Enabled = true;
                
            }
            private void TimeEvent(object source, ElapsedEventArgs e)
            {
                int i = YBpoll();
                switch (i)
                {
                    case 0:
                        Invoke(new strText(TimeStr), "通讯正常");
                        break;
                    case 1:
                        Invoke(new strText(TimeStr), "通讯正常");
                        break;
                    case 11:
                        Invoke(new strText(TimeStr), "收到一元硬币");
                        break;
                    case 55:
                        Invoke(new strText(TimeStr), "收到五角硬币");
                        break;
                    case -1:
                        Invoke(new strText(TimeStr), "投币器关闭");
                        break;
                    case -2:
                        Invoke(new strText(TimeStr), "命令错误");
                        break;
                    case -3:
                        Invoke(new strText(TimeStr), "被拒绝");
                        break;
                    case -4:
                        Invoke(new strText(TimeStr), "通道关闭");
                        break;
                    case -5:
                        Invoke(new strText(TimeStr), "其它错误");
                        break;
                    default:
                        Invoke(new strText(TimeStr), "其它错误");
                        break;
                        
                }
            }
            private delegate void strText(string str);        private void TimeStr(string str)
            {
                textBox1.Text = str;
            }        private void button2_Click(object sender, EventArgs e)
            {
                if (aTimers.Enabled == true)
                {
                    aTimers.Enabled = false;
                }
                //aTimers.Stop();
                if (aTimers.Enabled == false)
                {
                    textBox1.Text = "定时关闭!";
                }
                
       
            }
    我改了一下,这样就可以了