DispatcherTimer不会触发Tick事件

时间:2011-03-22 15:41:42

标签: c# dispatchertimer

我有一个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事件永远不会被解雇,我错过了什么吗?

5 个答案:

答案 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事件