C# 如何在启动windows服务之前延迟5分钟?
我正在使用.NET4构建一个简单的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
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认为其出现故障时,服务必须做出响应。所以你有两个选择:
protected override void OnStart(string[] args)
{
// make a 5 min delay
// do something
}
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年。我们并不总是可以选择我们使用什么,或者我们的客户使用什么。