Timer won't tick

前端 未结 7 1742
一整个雨季
一整个雨季 2020-12-10 03:31

I have a Windows.Forms.Timer in my code, that I am executing 3 times. However, the timer isn\'t calling the tick function at all.

private int co         


        
相关标签:
7条回答
  • 2020-12-10 03:34

    Try using System.Timers instead of Windows.Forms.Timer

    void Loopy(int times)
    {
        count = times;
        timer = new Timer(1000);
        timer.Enabled = true;
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Start();
    }
    
    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        throw new NotImplementedException();
    }
    
    0 讨论(0)
  • 2020-12-10 03:35

    If the method Loopy() is called in a thread that is not the main UI thread, then the timer won't tick. If you want to call this method from anywhere in the code then you need to check the InvokeRequired property. So your code should look like (assuming that the code is in a form):

            private void Loopy(int times)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke((MethodInvoker)delegate
                    {
                        Loopy(times);
                    });
                }
                else
                {
                    count = times;
                    timer = new Timer();
                    timer.Interval = 1000;
                    timer.Tick += new EventHandler(timer_Tick);
                    timer.Start();
                }
            }
    
    0 讨论(0)
  • 2020-12-10 03:37

    Check if your timer in properties is enabled. Mine was false and after setting to true it worked.

    0 讨论(0)
  • 2020-12-10 03:41

    I am not sure what you are doing wrong it looks correct, This code works: See how it compares to yours.

    public partial class Form1 : Form
    {
        private int count = 3;
        private Timer  timer;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            Loopy(count);
        }
    
        void Loopy(int times)
        {
            count = times;
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }
    
        void timer_Tick(object sender, EventArgs e)
        {
            count--;
            if (count == 0) timer.Stop();
            else
            {
                //
            }
        } 
    
    }
    
    0 讨论(0)
  • 2020-12-10 03:48

    Here's an Rx ticker that works:

    Observable.Interval(TimeSpan.FromSeconds(1))
    .Take(3)
    .Subscribe(x=>Console.WriteLine("tick"));
    

    Of course, you can subscribe something more useful in your program.

    0 讨论(0)
  • 2020-12-10 03:54

    If you are using Windows.Forms.Timer then should use something like following.

    //Declare Timer
    private Timer _timer= new Timer();
    
    void Loopy(int _time)
    {
    
        _timer.Interval = _time;
        _timer.Enabled = true;
        _timer.Tick += new EventHandler(timer_Elapsed);
        _timer.Start();
    }
    
    void timer_Elapsed(object sender, EventArgs e)
    {
        //Do your stuffs here
    }
    
    0 讨论(0)
提交回复
热议问题