Как отложить 5 минут до запуска службы Windows? - PullRequest
6 голосов
/ 10 августа 2011

Я использую .Net 4 для создания простой службы Windows, проблема возникает, когда я хочу сделать 5-минутную задержку перед запуском службы.

protected override void OnStart(string[] args)
{
    // make a 5 min delay
    // do something
}

но через несколько секунд служба останавливается и выдает ошибку тайм-аута (увидела это в журнале событий). что я должен делать?

Ответы [ 8 ]

5 голосов
/ 10 августа 2011

Запустите длительный процесс в новом потоке, поэтому не блокируйте метод OnStart. Пример:

using System.Threading;

protected override void OnStart(string[] args)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback((_) =>
    {
        Thread.Sleep(5 * 1000 * 60);//simulate 5 minutes work

       // do something
    }));
}
3 голосов
/ 10 августа 2011

Dont. Услуги должны запускаться по запросу. OnStart ДОЛЖЕН ВЕРНУТЬСЯ. БЫСТРО .

Тем не менее, служба может ждать 5 минут, пока она НЕ ДЕЛАЕТ что-то, но вы не можете просто остановить цикл запуска.

Запустите его, затем попросите рабочий поток подождать, пока он что-то не сделает.

Тем не менее, есть запись конфигурации, которая позволяет запускать службу с задержкой. Это настроенный FOR сервис, очень похожий на Manual, Automatic, есть запись delayed. Это гарантирует, что сервис запускается только тогда, когда у машины было мало времени, чтобы успокоиться от запуска. Это может быть лучше / достаточно хорошо.

2 голосов
/ 10 августа 2011

Метод OnStart должен возвращаться своевременно, в противном случае вы получите ошибку тайм-аута.

Что вам нужно сделать, это запустить поток с OnStart и в этом потоке подождать 5 минут, прежде чем вы фактически запустите службу. Таким образом, ваш OnStart метод становится:

serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod));

serviceThread.Start();

И WorkerClass.WorkerMethod выполняет фактический запуск услуги.

1 голос
/ 10 августа 2011

Используйте System.Timers.Timer, чтобы отложить ваши действия ... Вот код из одного из моих сервисов.Причина, по которой я использую отсрочку, заключается в том, что Windows предполагает, что служба не работает, если для возврата из события onstart требуется слишком много времени.Поскольку при первом запуске службы я делаю много вещей, я запускаю службу очень быстро, просто создав таймер, а затем позволяю этому событию иметь дело с реальными средствами запуска.

    protected override void OnStart(string[] args)
    {
        try
        {
            // Using a timer Event to start asynchronously
            StartupTimer = new Timer();
            StartupTimer.Elapsed += StartupTimer_Elapsed;
            StartupTimer.AutoReset = false;
            StartupTimer.Interval = 5*60*1000;
            StartupTimer.Start();
        }
        catch (Exception ex)
        {
            LogMessage(true, ex.ToString());
        }
    }

    private void StartupTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            RunSetup(true);
        }
        catch (Exception ex)
        {
            LogMessage(true, ex.ToString());
        }
    }
1 голос
/ 10 августа 2011

Я не понимаю, почему вы хотите отложить процедуру запуска службы на 5 минут. если процедура обслуживания занимает больше времени, Service Control Manager, вероятно, прерывает все операции, поэтому ваша служба не может запуститься. Скорее всего, вам нужно запустить поток / таймер в методе OnStart и подождать 5 минут в процедуре Thread / Timer.

protected override void OnStart(string[] args)
        {              
            Thread processor= new Thread(ThreadProc);
            processor.Start();
        }

        private void ThreadProc()
        {
            while (true)
            {
                Thread.Sleep(TimeSpan.FromMinutes(5));

            }
        }
1 голос
/ 10 августа 2011

Служба должна ответить, когда ей говорят о запуске, или Windows считает, что она неисправна.Таким образом, у вас есть два варианта:

  1. Написать отдельное приложение, которое запускается при запуске, ждет 5 минут, а затем запускает службу.

  2. Startуслугу, и поместите пятиминутную задержку, прежде чем она начнет делать то, что является ее бизнес-логикой.До тех пор, пока Windows думает, что она запустилась нормально, она счастлива.

Примерно так:

private static Timer t;
protected override void OnStart(string[] args)
{
    t = new Timer(5000*60);
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent)
    t.Start()
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    // real code here
}
0 голосов
/ 10 августа 2011

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

Вы можете это исправить, сначала сообщив Windows, что запуск этой службы займет некоторое время.

Для этого см. Ответы на этот вопрос SO: Время ожидания запуска службы Windows

0 голосов
/ 10 августа 2011

Прямой способ заключается в использовании System.Threading.Timer и установке времени 5 минут. Для получения дополнительной информации см. System.Threading.Timer .

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