У меня есть консольное приложение UCMA, и я хочу, чтобы он сообщал сигнал «Я живой», выписывая текущую временную метку в базу данных. Для этого я использую таймер:Таймер выполняется только один раз
public static void Main(string[] args)
{
Random r = new Random();
System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(TimerCallBack);
Timer TimerItem = new Timer(TimerDelegate, null, 0, r.Next(10000, 25000));
UCMASampleForwardIncomingCall ucmaSampleForwardIncomingCall = new UCMASampleForwardIncomingCall()
ucmaSampleForwardIncomingCall.Run();
}
TimerCallBack
записывает данные в базу данных, ucmaSampleForwardIncomingCall
является «основным» методом программы, все важно на данном этапе, что после начальной конфигурации он ждет события. Но выше код выполняется таймер только один раз ... я думал о помещении ucmaSampleForwardIncomingCall
на отдельном потоке:
public static void Main(string[] args)
{
Random r = new Random();
System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(TimerCallBack);
Timer TimerItem = new Timer(TimerDelegate, null, 0, r.Next(10000, 25000));
Thread callThread = new Thread(new ThreadStart(ucmaSampleForwardIncomingCall.Run));
callThread.Start();
, но все еще таймер выполняется только один раз. Я читал "How-to set timer" thread, но я до сих пор запутался здесь ...
EDIT: используя GC.keepAlive(TimerItem)
решил проблему.
редактировать 2: или нет ... после нескольких событий таймер останавливается, вероятно, когда был исключением пойманы в ucmaSampleForwardIncomingCall
редактировать 3: в настоящее время работает с:
public static void Main(string[] args)
{
Random r = new Random();
Timer TimerItem = new Timer(TimerCallBack, null, 0, r.Next(10000, 15000));
ucmaSampleForwardIncomingCall.Run();
GC.KeepAlive(TimerItem);
}
private static void TimerCallBack(Object o)
{.... more code.....}
Но я не удерживая мои надежды слишком высоко ...
Вышеупомянутые ответы в этом вопросе SO имеют все те же ошибки, что и вы. Переменная 'TimerItem' недостаточна, чтобы объект Timer не получал сбор мусора. Сохраните его в статическом поле или поместите GC.KeepAlive (TimerItem) в конец вашего метода Main(). –
Спасибо, не могли бы вы назвать его ответом, чтобы я мог отметить его? – Yasskier
К сожалению, это не решило проблему при более длительном запуске: да, она запускается, но после нескольких событий таймер останавливается в любом случае. :( – Yasskier