DispatcherTimer не запускает событие Tick - PullRequest
14 голосов
/ 22 марта 2011

У меня есть 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 ]

28 голосов
/ 22 марта 2011

Если это ваша главная точка входа, вероятно (почти наверняка), что метод Main завершится до того, как может произойти первое событие DispatcherTimer.

Как только Main завершится,процесс будет остановлен, так как других потоков переднего плана нет.

При этом DispatcherTimer действительно имеет смысл только в том случае, когда у вас есть Dispatcher, например, в приложении WPF или Silverlight.Для приложения в консольном режиме вам следует рассмотреть возможность использования класса таймера , то есть:

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!");
}
5 голосов
/ 22 марта 2011

потому что поток основного метода завершился до вызова тика.

4 голосов
/ 22 марта 2011

Вы пропустили Application.Run (). События тиков не могут отправляться без цикла диспетчера. Второстепенная проблема заключается в том, что ваша программа немедленно завершается до того, как событие может быть инициировано. Application.Run () также решает эту проблему, блокирует метод Main ().

1 голос
/ 22 марта 2011

Вы должны запустить диспетчер, чтобы диспетчер "делал" любые события.Если вы работаете внутри приложения WPF, это должно произойти автоматически.Если вы работаете в консоли (как это выглядит), это никогда не сработает, потому что нет диспетчера.Самое простое, что вы можете сделать, это попробовать это в приложении WPF, и оно должно работать нормально.

0 голосов
/ 17 ноября 2015

Вы должны использовать

static void DispatcherTimer_Tick(object sender, object e)
{

}

вместо события timer_tick

...