17

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

4

6 回答 6

34

如果这是您的主要入口点,则该方法很可能(几乎可以肯定)在第一个事件可能发生Main之前退出。DispatcherTimer

Main 完成后,该进程将立即关闭,因为没有其他前台线程。

话虽如此,只有在您拥有.WPF 或 Silverlight 应用程序DispatcherTimer的用例中才有意义。Dispatcher对于控制台模式应用程序,您应该考虑使用Timer 类,即:

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!");
}
于 2011-03-22T15:45:02.390 回答
6

因为 main 方法线程在调用 tick 之前就结束了。

于 2011-03-22T15:45:06.697 回答
5

你错过了 Application.Run()。如果没有调度程序循环,则无法调度 Tick 事件。第二个问题是您的程序在事件发生之前立即终止。Application.Run() 也解决了这个问题,它阻止了 Main() 方法。

于 2011-03-22T15:45:17.333 回答
1

您必须启动调度程序才能让调度程序“执行”任何事件。如果您在 WPF 应用程序内部运行,这应该会自动发生。如果您在控制台中运行(看起来像),这将永远不会触发,因为没有调度程序。您可以做的最简单的事情是在 WPF 应用程序中尝试这个,它应该可以正常工作。

于 2011-03-22T15:47:18.053 回答
1

如果计时器是在工作线程中创建的,则Tick事件不会触发,因为没有调度程序。

您必须在 UI 线程中创建计时器或使用将实例作为第二个参数的DispatcherTimer构造函数,传递 UI 调度程序:Dispatcher

var timer = new DispatcherTimer(DispatcherPriority.Background, uiDispatcher);
于 2021-08-13T16:15:59.153 回答
-3

你必须使用

static void DispatcherTimer_Tick(object sender, object e)
{

}

代替 timer_tick 事件

于 2015-11-17T18:17:14.600 回答