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