Таймер не будет отмечать

У меня есть Windows.Forms.Timer в моем коде, который я выполняю 3 раза. Тем не менее, таймер вообще не вызывает функцию тика.

private int count = 3;
private timer;
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
    {
        // Do something here
    }
}

Loopy() вызывается из других мест в коде.

Ответ 1

Попробуйте использовать System.Timers вместо 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();
}

Ответ 2

Если метод Loopy() вызывается в потоке, который не является основным потоком пользовательского интерфейса, тогда таймер не будет отмечен. Если вы хотите вызвать этот метод из любого места в коде, вам необходимо проверить свойство InvokeRequired. Таким образом, ваш код должен выглядеть (при условии, что код имеет форму):

        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();
            }
        }

Ответ 3

Я не уверен, что вы делаете неправильно, это выглядит правильно, этот код работает: посмотрите, как он сравнивается с вашим.

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
        {
            //
        }
    } 

}

Ответ 4

Здесь используется Rx тикер:

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

Конечно, вы можете подписаться на что-то более полезное в вашей программе.