[C#] Timer в консольном приложении

Polly_love

подписываемся на событие от таймера
public void EventFunction(object sender, EventArgs e)
{
//обработка события
}
Main
{
Timer timer = new Timer;
Timer.Interval = 100;
Timer.Enabled = true;
Timer.Tick += new EventHandler(EventFunction);
///
}
Как теперь подождать прихода события от таймера...?

kokoc88

Это не консольный таймер. Используй System.Threading.Timer, в хэлпе написано, как ждать выполнения

Polly_love

спасибо, с System.Threading.Timer разобрался, но задачу решить не помогло, опишу проблему подробней:
есть класс(предназначенный для использования в WinForms приложении) который должен раз в секунду читать из потока строчку и выводить на экран, при этом естественно возникает необходимость в создании внутреннего таймера,
при использовании System.Windows.Forms.Timer в GUI приложении все работает как хотелось бы.
теперь понадобилось сделать консольное приложение с использованием этого класса (на самом деле просто пишется тест в NUnits)
но в этом случае FormsTimer не работает, и получается нужно использговатьSystem.Threading.Timer(который в GUI приложении не нужен и к тому же возникает необходимость передать в этот самый класс Instance от AutoResetEvent, т.е. нужно изменить параметры вызов функции, те внести глубокие изменения.
те задача по-всей видимости сводится все-таки к тому как заставить WinForms таймер тикать в консольном приложении....

kokoc88

Измени таймер везде на System.Threading.Timer

Dasar

> те задача по-всей видимости сводится все-таки к тому как заставить WinForms таймер тикать в консольном приложении....
в конце теста руками какое-то время крутить очередь сообщений
for (...)
{
Application.DoEvents;
}

Dasar

> Измени таймер везде на System.Threading.Timer
глюки с тредами потом кто будет вылавливать?

kokoc88

в конце теста руками какое-то время крутить очередь сообщений
Ну вот не стал бы я такие вещи советовать.

Dasar

> Ну вот не стал бы я такие вещи советовать.
для теста это уж точно лучше, чем заменять winforms-таймер на тредный таймер.

Dasar

> Ну вот не стал бы я такие вещи советовать
кстати в чем ты видишь проблемы?

kokoc88

кстати в чем ты видишь проблемы?
Ну думаю в таком конкретном случае проблем может и не возникнуть. А так они бывают, если используешь цикл сообщений либо не по делу, либо для каких-то корыстных целей. Я просто считаю это не очень аккуратной практикой программирования. Но спорить не буду.

more2006

DoEvent спасибо это то, что было нужно

more2006

>Измени таймер везде на System.Threading.Timer
это плохо, придется по стеку вызовов тащить AutoResetEvent....

kokoc88

это плохо, придется по стеку вызовов тащить AutoResetEvent....
Это не плохо, это правильно. (Т.е. если ты не можешь написать это правильно, то это не значит, что всё плохо.)

Polly_love

>Это не плохо, это правильно. (Т.е. если ты не можешь написать это правильно, то это не значит, что всё плохо.)
Пока я вижу, что это плохо, а вижу я следующее -
есть форма, есть драйвер устройства(читающий из потока раз в секунду сообщение обращение к этому драйверу(а конкретнее к таймеру) проходит через многоуровневый интерфейс, сл-но я должен добавить на каждом уровне прием-передачу от уровня к уровню объекта AutoResetEvent(или передавать ссылку на таймер снизу вверх).. На верхнем уровне(форма, или Main-функция) я к тому же должен хранить этот AutoResetEvent
зачем это делать когда с помощью WinForms таймера удается автоматически "зарегистрировать" таймер глобально....
так что ничего правильного я пока не вижу, если что не так поправь.

kokoc88

так что ничего правильного я пока не вижу, если что не так поправь.
Я не понимаю, зачем передавать куда-то AutoResetEvent. Есть класс, который читает строчку раз в секунду. В этом классе есть таймер, который вызывает колбэк.
    class Program
{
static void OnTimer(Object stateInfo)
{
Console.WriteLine("OnTimer");
}

static void Main(string[] args)
{
Timer t = new Timer(OnTimer, null, 1000, 1000);
Thread.Sleep(5500);
}
}

Polly_love

спасибо, здорово ничего оказывается не надо передавать... так даже лучше!
Оставить комментарий
Имя или ник:
Комментарий: