timer计时器无法停止事件 求解

时间:2022-03-01 20:36:18
功能描述:点击Button1,执行timer_Elapsed事件,再点击停止执行;如此反复
问题:第二次点击 事件timer_Elapsed无法停止;
麻烦解释如何停止事件timer_Elapsed,解释下面这样为何无法停止事件timer_Elapsed
附代码:

public partial class _Default : System.Web.UI.Page 
{
    static int count = 0;   

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {        
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.AutoReset = true;
        timer.Enabled = true  ;
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Interval = 1000;

        count ++;
        if (count % 2 == 0)
        {
            timer.Enabled = false;
         } 
    }   

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        this.Label1 .Text += "8899-";
    }
}

29 个解决方案

#1


- -
用Enable把。

#2


将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来

#3


把事件减掉
timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed); 

#4


没那么简单
http://msdn.microsoft.com/zh-cn/library/system.timers.timer.stop(VS.80).aspx
例子比较复杂

#5


引用 2 楼 oonukeoo 的回复:
将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来


这也是问题

#6


引用 2 楼 oonukeoo 的回复:
将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来


无效,谢谢

#7


引用 3 楼 gws044010607 的回复:
把事件减掉
 timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);


无效,谢谢

#8


期待答案。。。

#9


楼主,你这个是web的程序吗?
如果是web的程序的话,建议楼主看看页面生存周期。

这种通过web传递的话,每次页面都是重新生成的。
因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。

为什么会有这种需求呢?

如果真的是想用全局变量的话,Application中可以放!
不过不建议这么做

#10


[Quote=引用 9 楼 ouc_ajax 的回复:]
楼主,你这个是web的程序吗?
 如果是web的程序的话,建议楼主看看页面生存周期。

+++++++++++++++++++++++++++++++++++++++++++++
public partial class _Default : System.Web.UI.Page 
++++++++++++++++++++++++++++++++++++++++++++++++

 这种通过web传递的话,每次页面都是重新生成的。
 因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
timer 未设置static变量,计数器设置static变量有误吗?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 为什么会有这种需求呢?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
做一个年终抽奖程序,Button1未按下第二次次前一直随机查询,按下第二次后停止,如此反复
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 如果真的是想用全局变量的话,Application中可以放!
 不过不建议这么做

#11


这种通过web传递的话,每次页面都是重新生成的。 
因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
timer 未设置static变量,计数器设置static变量有误吗? 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

测试没错误

#12



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Timers.Timer timer=new System.Timers.Timer();
        int count = 0;
        int beginbegin = 1;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            beginbegin++;
            if (beginbegin % 2==0)
            {
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Interval = 1000;
                timer.Enabled = true;
            }
            else 
            {
                timer.Enabled = false;
            }
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            count++;
            label1.Text = count.ToString();
        } 

    }
}

刚写了个测试下好用 你看看哪有些出入吧

#13


timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  不能放到你的Button Click event method中

#14


timer.Change( Timeout.Infinite, Timeout.Infinite );

这个和停止的效果是一样的
可以试试

#15


看看

#16


看样子还有点复杂啊

#17


private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Timer t = (Timer)sender;
             t.销毁;
            count++;
            label1.Text = count.ToString();
        } 


试试这个

#18


引用 12 楼 oonukeoo 的回复:
C# codeusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Timers;namespace WindowsFormsApplication1
{publicpartialclass Form1 : Form
    {
        System.Timers.Timer timer=new System.Timers.Timer();int count=0;int beginbegin=1;public Form1()
        {
            InitializeComponent();
        }privatevoid button1_Click(object sender, EventArgs e)
        {
            beginbegin++;if (beginbegin%2==0)
            {
                timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);
                timer.Interval=1000;
                timer.Enabled=true;
            }else 
            {
                timer.Enabled=false;
            }
        }privatevoid timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            count++;
            label1.Text= count.ToString();
        } 

    }
}
 刚写了个测试下好用 你看看哪有些出入吧


改过测试了,无法停止事件,区别是我用web,你的win forms,谢谢

#19


我来顶一下

#20


引用 13 楼 javak 的回复:
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  不能放到你的Button Click event method中

无效,谢谢

#21


引用 14 楼 linux7985 的回复:
timer.Change( Timeout.Infinite, Timeout.Infinite );

 这个和停止的效果是一样的
 可以试试

Change是System.Threading.Timer的方法,我此处用的是System.Timers.timer,五此方法,谢谢

#22


引用 17 楼 jerry_zhang99 的回复:
private void timer_Elapsed(object sender, ElapsedEventArgs e)
         {
             Timer t = (Timer)sender;
              t.销毁;
             count++;
             label1.Text = count.ToString();
         }


 试试这个

逻辑错误,无效,谢谢

#23


将timer设成全局的静态变量试试

#24


.

#25


学习中,帮顶。

#26


up

#27


友情帮顶!!!

#28


引用 22 楼 qery 的回复:
引用 17 楼 jerry_zhang99 的回复:
 private void timer_Elapsed(object sender, ElapsedEventArgs e)
          {
              Timer t = (Timer)sender;
               t.销毁;
              count++;
              label1.Text = count.ToString();
          }


  试试这个

 逻辑错误,无效,谢谢


不可能

#29


引用 23 楼 cykevin 的回复:
如需要阅读该回复,请登录或注册CSDN!


学习一下

#1


- -
用Enable把。

#2


将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来

#3


把事件减掉
timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed); 

#4


没那么简单
http://msdn.microsoft.com/zh-cn/library/system.timers.timer.stop(VS.80).aspx
例子比较复杂

#5


引用 2 楼 oonukeoo 的回复:
将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来


这也是问题

#6


引用 2 楼 oonukeoo 的回复:
将timer设置为全局变量吧 你这样写第一次和第二次点击的timer是两个 可不停不下来


无效,谢谢

#7


引用 3 楼 gws044010607 的回复:
把事件减掉
 timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);


无效,谢谢

#8


期待答案。。。

#9


楼主,你这个是web的程序吗?
如果是web的程序的话,建议楼主看看页面生存周期。

这种通过web传递的话,每次页面都是重新生成的。
因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。

为什么会有这种需求呢?

如果真的是想用全局变量的话,Application中可以放!
不过不建议这么做

#10


[Quote=引用 9 楼 ouc_ajax 的回复:]
楼主,你这个是web的程序吗?
 如果是web的程序的话,建议楼主看看页面生存周期。

+++++++++++++++++++++++++++++++++++++++++++++
public partial class _Default : System.Web.UI.Page 
++++++++++++++++++++++++++++++++++++++++++++++++

 这种通过web传递的话,每次页面都是重新生成的。
 因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
timer 未设置static变量,计数器设置static变量有误吗?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 为什么会有这种需求呢?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
做一个年终抽奖程序,Button1未按下第二次次前一直随机查询,按下第二次后停止,如此反复
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 如果真的是想用全局变量的话,Application中可以放!
 不过不建议这么做

#11


这种通过web传递的话,每次页面都是重新生成的。 
因此第一次按钮打开的timer无论是不是设置static都是不可能关闭的。 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
timer 未设置static变量,计数器设置static变量有误吗? 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

测试没错误

#12



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Timers.Timer timer=new System.Timers.Timer();
        int count = 0;
        int beginbegin = 1;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            beginbegin++;
            if (beginbegin % 2==0)
            {
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Interval = 1000;
                timer.Enabled = true;
            }
            else 
            {
                timer.Enabled = false;
            }
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            count++;
            label1.Text = count.ToString();
        } 

    }
}

刚写了个测试下好用 你看看哪有些出入吧

#13


timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  不能放到你的Button Click event method中

#14


timer.Change( Timeout.Infinite, Timeout.Infinite );

这个和停止的效果是一样的
可以试试

#15


看看

#16


看样子还有点复杂啊

#17


private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Timer t = (Timer)sender;
             t.销毁;
            count++;
            label1.Text = count.ToString();
        } 


试试这个

#18


引用 12 楼 oonukeoo 的回复:
C# codeusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Timers;namespace WindowsFormsApplication1
{publicpartialclass Form1 : Form
    {
        System.Timers.Timer timer=new System.Timers.Timer();int count=0;int beginbegin=1;public Form1()
        {
            InitializeComponent();
        }privatevoid button1_Click(object sender, EventArgs e)
        {
            beginbegin++;if (beginbegin%2==0)
            {
                timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);
                timer.Interval=1000;
                timer.Enabled=true;
            }else 
            {
                timer.Enabled=false;
            }
        }privatevoid timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            count++;
            label1.Text= count.ToString();
        } 

    }
}
 刚写了个测试下好用 你看看哪有些出入吧


改过测试了,无法停止事件,区别是我用web,你的win forms,谢谢

#19


我来顶一下

#20


引用 13 楼 javak 的回复:
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  不能放到你的Button Click event method中

无效,谢谢

#21


引用 14 楼 linux7985 的回复:
timer.Change( Timeout.Infinite, Timeout.Infinite );

 这个和停止的效果是一样的
 可以试试

Change是System.Threading.Timer的方法,我此处用的是System.Timers.timer,五此方法,谢谢

#22


引用 17 楼 jerry_zhang99 的回复:
private void timer_Elapsed(object sender, ElapsedEventArgs e)
         {
             Timer t = (Timer)sender;
              t.销毁;
             count++;
             label1.Text = count.ToString();
         }


 试试这个

逻辑错误,无效,谢谢

#23


将timer设成全局的静态变量试试

#24


.

#25


学习中,帮顶。

#26


up

#27


友情帮顶!!!

#28


引用 22 楼 qery 的回复:
引用 17 楼 jerry_zhang99 的回复:
 private void timer_Elapsed(object sender, ElapsedEventArgs e)
          {
              Timer t = (Timer)sender;
               t.销毁;
              count++;
              label1.Text = count.ToString();
          }


  试试这个

 逻辑错误,无效,谢谢


不可能

#29


引用 23 楼 cykevin 的回复:
如需要阅读该回复,请登录或注册CSDN!


学习一下