如何在启动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
}
但几秒钟后,服务停止,并给我一个超时错误(在事件日志中看到了这一点(。我该怎么办?
在新线程中启动长时间运行的进程,因此不要阻塞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认为它出现故障时,它必须做出响应。所以你有两个选择:
-
编写一个单独的应用程序,在启动时运行,等待5分钟,然后启动服务。
-
启动服务,并在它开始执行任何业务逻辑之前延迟五分钟。只要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服务启动超时