【发布时间】:2018-06-28 14:37:43
【问题描述】:
我的 Windows 服务有问题。有时服务无法停止并以运行状态挂起)在带有消息的启动命令之后:
The service cannot accept control messages at this time
简化的服务实现:
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
【问题讨论】:
-
有时在开发服务时会发生这种情况,而您在构建时尝试再次部署。尝试重新启动计算机以查看是否可以解决问题。 (出于这个原因,在 VM 中开发服务通常是一个好主意)
-
//Some stop logic里面的代码是什么,你确定没有卡在那里? -
尝试使用命令行。 “网络停止 [ServiceName]”。还有“SC STOP [SERVICENAME]”和“SC DELETE [SERVICENAME]”
-
这在开发人员的环境中不会发生。用户尝试通过 MSI 更新软件,但安装程序无法停止服务,当您尝试手动停止服务时,您会看到这样的消息。
-
我知道如何停止服务问题是为什么会发生。而且我 100% 确定 stop 方法永远不会被命中,因为我在方法的开头有一个内部变量,并且在锁定之前有一些日志记录行。我检查了windbg中的变量,OnStop方法从未被命中。
标签: c# .net windows-services