System.threading.timer не работает в службе Windows - PullRequest
4 голосов
/ 22 сентября 2011

Я использую System.threading.timer в Windows Service. Но таймер не был успешно выполнен. Ниже приведен код.

    protected override void OnStart(string[] args)
    {
        try
        {  
        eventLog1.WriteEntry("In OnStart");
        TimeSpan dueMinutes = TimeSpan.FromMinutes(1);
        TimeSpan fromMinutes = TimeSpan.FromMinutes(1);
        System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(CallBack), null, dueMinutes, fromMinutes);


            /*
        System.Timers.Timer timer = new System.Timers.Timer(5 * 60 * 1000);       
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);               
            DBSyncHandler sync = new DBSyncHandler();
            sync.startSync();                 
        */
        }
        catch (Exception ex)
        {
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyEventLog";
            eventLog1.WriteEntry("Error : " + ex.Message);
        }

    }



    public static void CallBack(object sender)
    {

        try
        {
            DBSyncHandler sync = new DBSyncHandler();
            sync.startSync();
        }
        catch (Exception ex)
        {
            EventLog eventLog1 = new EventLog();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyEventLog";
            eventLog1.WriteEntry("Error : " + ex.Message);
        }

    }

После успешной установки. Моя рабочая станция перезапускается. При перезапуске машины служба вызывается успешно. Но как только служба вызывается в первый раз, она не повторяется в течение следующего времени, т. Е. Служба больше не вызывается.

Ответы [ 2 ]

13 голосов
/ 22 сентября 2011

Прочтите заметки на MSDN: http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

Пока вы используете таймер, вы должны хранить ссылку на него. Как с любым управляемым объектом, таймер подлежит сборке мусора, когда нет никаких ссылок на это. Тот факт, что таймер все еще активен не мешает его собрать.

System.Threading.Timer - это простой, легкий таймер, который использует методы обратного вызова и обслуживаются потоками пула потоков. Это не рекомендуется для использования с Windows Forms, потому что его обратные вызовы не происходят в потоке пользовательского интерфейса. System.Windows.Forms.Timer является лучший выбор для использования с Windows Forms. Для серверного таймера функциональность, вы можете рассмотреть возможность использования System.Timers.Timer, который вызывает события и имеет дополнительные функции.

Я думаю, что ваш объект таймера, созданный в OnStart, собирается или удаляется gc. он не должен быть локальной переменной в этом методе, поскольку он выходит за пределы области действия.

2 голосов
/ 22 сентября 2011

Ваша переменная таймера должна быть на уровне класса. Как только он выходит из области видимости, он больше не работает.

Microsoft рекомендует использовать System.Timers.Timer в коде сервера.

Дополнительная информация доступна на веб-сайте MSDN. http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...