我们有一个用C#编写的Windows服务,它基本上是在某个端口上启动Web API。该服务配置为在第一次故障和第二次故障时重新启动。 “后续失败”设置为“不采取行动”。 如果可能使用此端口,则服务将因未处理的异常而崩溃,并且在我们未处理的异常回调中,我们将转储文件写入某个应用程序目录。无论出于何种原因,Windows一直反复重启服务,即使它已多次崩溃。我们的服务结构如下:
public class WinService : ServiceBase
{
private WebApiHostWrapper _apiHost;
private Thread _workerThread;
public WinService()
{
InitializeComponent();
ServiceName = "MyService";
// register handler for writing dumpfiles
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptions.DomainUnhandledException;
}
protected override void OnStart(string[] args)
{
_workerThread = new Thread(InternalStart) { Name = "StartupThread" };
_workerThread.Start(args);
}
private void InternalStart(object args)
{
if (null == _service)
{
Thread.MemoryBarrier();
_apiHost= new WebApiHostWrapper();
_apiHost.Start((string[])args); // exception here
}
}
protected override void OnStop()
{
if (null != _workerThread)
{
_apiHost.Dispose();
_apiHost= null;
if (!_workerThread.Join(5000))
{
_workerThread.Abort();
}
Thread.MemoryBarrier();
_workerThread = null;
}
}
在Windows事件日志中,我看到4个条目。
在端口已在使用的情况下,这会导致服务一次又一次崩溃,使系统充满转储文件。 Windows将始终独立于设置重新启动服务。有没有一种特殊的方法如何崩溃以便考虑“后续故障”而不是重新启动服务?
答案 0 :(得分:-1)
我发现只导致“第一次失败”的问题被执行了。我们将“重置失败计数后”设置为0天。将此值设置为1后,服务崩溃了2次,然后不再重新启动。
来源:
Clarification on Windows Service Recovery Actions Settings
http://www.happysysadm.com/2011/12/understanding-windows-services-recovery.html