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

C# 如何在启动windows服务之前延迟5分钟?,c#,windows-services,C#,Windows Services,我正在使用.NET4构建一个简单的windows服务,当我想在启动服务之前延迟5分钟时,就会出现问题 protected override void OnStart(string[] args) { // make a 5 min delay // do something } 但几秒钟后,服务停止,并给我一个超时错误(在事件日志中看到)。 我该怎么办?在新线程中启动长时间运行的进程,因此不要阻止OnStart方法。例如: using System.Threading; pr

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

protected override void OnStart(string[] args)
{
    // make a 5 min delay
    // do something
}
但几秒钟后,服务停止,并给我一个超时错误(在事件日志中看到)。
我该怎么办?

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

不要。服务必须在要求时启动<代码>启动必须返回。快速

这就是说,该服务可以等待5分钟,直到它做了某件事,但你不能仅仅停止启动周期

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


也就是说,有一个配置条目允许延迟启动服务。它为服务配置了,就像
手动、自动
有一个
延迟
条目一样。这样可以确保只有当机器从启动时有一点时间稳定下来时,服务才会启动。这可能更好/更好。

当服务被告知启动时,或者Windows认为其出现故障时,服务必须做出响应。所以你有两个选择:

  • 编写一个单独的应用程序,在启动时运行,等待5分钟,然后启动服务

  • protected override void OnStart(string[] args)
    {
        // make a 5 min delay
        // do something
    }
    
  • 启动该服务,并在它开始执行任何业务逻辑之前延迟五分钟。只要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
    }
    

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

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

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

    WorkerClass。WorkerMethod
    执行服务的实际启动。

    我不明白您为什么要将服务启动例程延迟5分钟。如果服务例程需要更长的时间,服务控制管理器可能会中止所有操作,因此您的服务无法启动。您需要在OnStart方法中启动一个线程/计时器,并在线程/计时器过程中等待5分钟

    protected override void OnStart(string[] args)
    {
        // make a 5 min delay
        // do something
    }
    
    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延迟您的操作。。。这是我的一项服务的一些代码。我使用延迟的原因是,如果从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分钟,有关详细信息,请参阅。

    问题的根源是,如果服务需要较长时间启动Windows,Windows会认为它出现故障并将其关闭

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


    要执行此操作,请查看此SO问题的答案:

    您能否解释有关配置条目的更多信息?请打开windows服务配置,查看选项,使用谷歌。没那么难,来吧。让我来做吧。谷歌“Windows服务启动延迟”,第二项是@TomTom这将是一个很好的解决方案,但它仅在Win7、Vista和2008服务器上受支持……是的。好主意。忽略操作系统中的windows延迟服务启动选项,然后对其进行手动编码。@TomTom:
    Yes。好主意。忽略操作系统中的windows延迟服务启动选项,然后对其进行手动编码。
    为什么选择-1?你是不是搞错了?TomTom你是不是说所有版本的windows都支持延迟服务选项,因为我使用的是windows 2003。不是,只有最新版本的。2003年已经是生命的尽头了。@TomTom:2003还将继续支持4年。我们并不总是可以选择我们使用什么,或者我们的客户使用什么。