我有一个与Windows服务相关的问题。有时在启动命令后,服务无法停止并处于运行状态,并显示以下消息:
该服务目前无法接受控制信息
简化的服务实现如下:
using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class Service : ServiceBase
{
protected object SyncRoot { get; } = new object();
protected override void OnStart(string[] args)
{
lock (SyncRoot)
{
var task = PerformHealthCheck();
while (!task.Wait(10000))
{
RequestAdditionalTime(10000);
}
Task.Factory.StartNew(() =>
{
//Some logic to start worker threads and initialize some startup processes
//All workers threads actually successfully executed.
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
}
protected override void OnStop()
{
//Code is not reachable sometimes
lock (SyncRoot)
{
//Some stop logic
}
}
private static async Task PerformHealthCheck()
{
int status = 0;
do
{
status = CheckStatus();
if (status == 0)
{
await Task.Delay(20000);
}
}
while (status == 0);
}
private static int CheckStatus()
{
//Calculating HealthCheck status
return 0;
}
}
}
创建逻辑:
internal static class Program
{
private static void Main(string[] args)
{
ServiceBase.Run(new Service());
}
}
OnStart 方法已成功执行到结束,而 OnStop 方法甚至未被触发。我可以在 WinDbg 中看到以下服务状态:
16 serviceType
4 currentState
5 controlsAccepted
0 win32ExitCode
0 serviceSpecificExitCode
0 checkPoint
0 waitHint
据我所知,该服务处于运行状态并已接收停止命令,但未执行(从日志中可以看出)。我不明白有什么可能会阻止服务执行OnStop方法。在Windows事件视图中可以看到启动命令,但没有停止命令。
其他信息:
- .NET 4.5框架
- Windows Server 2012-2016
//Some stop logic
内的代码是什么?你确定它没有卡在那里吗? - DavidG