Таймер не будет отмечать
У меня есть 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"));
Конечно, вы можете подписаться на что-то более полезное в вашей программе.