2014-12-14 6 views
0

У меня есть консольное приложение 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.....} 

Но я не удерживая мои надежды слишком высоко ...

+1

Вышеупомянутые ответы в этом вопросе SO имеют все те же ошибки, что и вы. Переменная 'TimerItem' недостаточна, чтобы объект Timer не получал сбор мусора. Сохраните его в статическом поле или поместите GC.KeepAlive (TimerItem) в конец вашего метода Main(). –

+0

Спасибо, не могли бы вы назвать его ответом, чтобы я мог отметить его? – Yasskier

+0

К сожалению, это не решило проблему при более длительном запуске: да, она запускается, но после нескольких событий таймер останавливается в любом случае. :( – Yasskier

ответ

0

Я не могу прокомментировать ваш вопрос из-за репутации менее 50: D, но я думаю, что лучше определить поле для вашего таймера, потому что если обратный вызов является статическим полем, то это объект root необходимо определить в том же объеме. Код будет таким, и я надеюсь, что это поможет вам.

private static Timer timer = new Timer(); 

public static void Main(string[] args) 
{ 
    // timer properties will be set here 
    timer.Tick += timer_Tick; 
    ucmaSampleForwardIncomingCall.Run(); 
} 

private static void timer_Tick(Object o) {} 
Смежные вопросы