Как задержать 5 мин перед запуском службы windows?

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

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

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

8 ответов


Начните свой длительный процесс в новом потоке, поэтому не блокируйте 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
    }));
}

нет. Услуги должны начинаться, когда их просят. OnStart ВЕРНУТЬСЯ. Быстро!--5-->.

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

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

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


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

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

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

serviceThread.Start();

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


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

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

  2. запустите службу и поместите в нее пятиминутную задержку, прежде чем она начнет делать то, что является бизнес-логикой. Пока 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
}

Я не понимаю, почему вы хотите отложить процедуру запуска службы на 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));

            }
        }

используйте систему.Таймеры.Таймер для отсрочки ваших действий... Вот код от одной из моих служб. Причина, по которой я использую отсрочку, заключается в том, что 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());
        }
    }

прямой путь использовать систему.Нарезка резьбы.Таймер и установить это время до 5 минут, пожалуйста, смотрите


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

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

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