我有一个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事件永远不会被解雇,我错过了什么吗?
答案 0 :(得分:27)
如果这是您的主要切入点,那么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!");
}
答案 1 :(得分:5)
因为主方法线程在调用tick之前结束。
答案 2 :(得分:4)
你错过了Application.Run()。如果没有调度程序循环,则无法调度Tick事件。第二个问题是您的程序会在事件发生之前立即终止。 Application.Run()也解决了这个问题,它阻塞了Main()方法。
答案 3 :(得分:1)
您必须启动一个调度员,以便调度员“执行”任何事件。如果您在WPF应用程序内运行,则应自动执行此操作。如果您在控制台(它看起来像)中运行,这将永远不会触发,因为没有调度程序。你可以做的最简单的事情是在WPF应用程序中尝试这个,它应该可以正常工作。
答案 4 :(得分:-3)
你必须使用
static void DispatcherTimer_Tick(object sender, object e)
{
}
代替timer_tick事件