DispatcherTimer не запускает событие Tick
У меня есть DispatcherTimer, который я инициализировал так:
static DispatcherTimer _timer = new DispatcherTimer();
static void Main()
{
_timer.Interval = new TimeSpan(0, 0, 5);
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Start();
}
static void _timer_Tick(object sender, EventArgs e)
{
//do something
}
Событие _timer_Tick никогда не срабатывает, я что-то пропустил?
Ответы
Ответ 1
Если это ваша основная точка входа, вероятно (почти наверняка), что метод Main
завершается до того момента, когда произойдет первое событие DispatcherTimer
.
Как только Main завершится, процесс будет завершен, так как других нитей нет.
Как говорится, DispatcherTimer
действительно имеет смысл только в том случае, когда у вас есть Dispatcher
, например приложение WPF или Silverlight. Для приложения с консольным режимом вы должны использовать Timer class, то есть:
static System.Timers.Timer _timer = new System.Timers.Timer();
static void Main()
{
_timer.Interval = 5000;
_timer.Elapsed += _timer_Tick;
_timer.Enabled = true;
Console.WriteLine("Press any key to exit...");
Console.ReadKey(); // Block until you hit a key to prevent shutdown
}
static void _timer_Tick(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Timer Elapsed!");
}
Ответ 2
потому что основной поток метода закончился до того, как был вызван тик.
Ответ 3
Вы пропустили Application.Run(). События Tick не могут быть отправлены без цикла диспетчера. Вторая проблема заключается в том, что ваша программа немедленно прекращается до того, как событие когда-либо может быть поднято. Application.Run() также решает, что он блокирует метод Main().
Ответ 4
Вам нужно запустить диспетчер, чтобы диспетчер "делал" любые события. Если вы работаете внутри приложения WPF, это должно произойти автоматически. Если вы работаете в консоли (как это выглядит), это никогда не будет срабатывать, потому что диспетчера нет. Самое простое, что вы можете сделать, это попробовать это в приложении WPF, и оно должно работать нормально.
Ответ 5
Вы должны использовать
static void DispatcherTimer_Tick(object sender, object e)
{
}
вместо события timer_tick