如何在启动windows服务之前延迟5分钟

本文关键字:延迟 5分钟 服务 windows 启动 | 更新日期: 2023-09-27 18:05:10

我正在使用.Net 4构建一个简单的windows服务,当我想在启动服务之前延迟5分钟时,就会出现问题。

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

但几秒钟后,服务停止,并给我一个超时错误(在事件日志中看到了这一点(。我该怎么办?

如何在启动windows服务之前延迟5分钟

在新线程中启动长时间运行的进程,因此不要阻塞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
    }));
}

Dont。服务必须在被要求时启动。OnStart必须返回。FAST

也就是说,该服务可以等待5分钟,直到它一些事情,但你不能只是停止启动周期。

启动它,然后让工作线程等待它执行某些操作。

也就是说,有一个配置条目允许延迟启动服务。它被配置为服务,就像Manual, Automatic一样,有一个delayed条目。这样可以确保只有当机器启动后有一段时间稳定下来时,服务才会启动。这可能更好/足够好。

OnStart方法需要及时返回,否则会出现超时错误。

您需要做的是从OnStart启动一个线程,并在该线程中等待5分钟,然后才能真正启动服务。因此,您的OnStart方法变为:

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

CCD_ 8完成了服务的实际启动。

当服务被告知启动时,或者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分钟。

protected override void OnStart(string[] args)
        {              
            Thread processor= new Thread(ThreadProc);
            processor.Start();
        }
        private void ThreadProc()
        {
            while (true)
            {
                Thread.Sleep(TimeSpan.FromMinutes(5));
            }
        }

使用System.Timers.Timer来推迟操作。。。这是我的一个服务的一些代码。我使用defer的原因是,如果从onstart事件返回的时间过长,windows会认为服务已损坏。由于我在服务第一次启动时做了很多事情,我只需创建一个计时器就可以很快启动服务,然后让该事件处理真正的启动事务。

    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());
        }
    }

直接的方法是使用System.Threading.Timer并将其到期时间设置为5分钟,有关详细信息,请参阅System.Threading.Timer。

问题的根源是,如果服务需要一段时间才能启动,Windows会认为它出现了故障并将其杀死。

您可以通过首先告诉Windows此服务需要一些时间才能启动来解决此问题。

要做到这一点,请参阅SO问题的答案:windows服务启动超时