为什么 Windows 10 在我的 Windows 服务中杀死了我的工作线程?

why did Windows 10 kill my worker thread in my Windows Service?

我使用 Visual Studio 2015 在 .NET 4 和 C# 中实现了 Windows 服务。在 OnStart 方法中,我的服务创建了一个循环的 "Worker Thread",阻塞 AutoResetEvent(连接到 Timer)。 "Worker Thread" 还有一个 CancellationTokenSource,它手动轮询以检查它是否应该停止工作。 OnStop 方法首先使用 CancellationTokenSource 取消,然后使用 AutoResetEvent 发出信号,唤醒注意到 "cancel" 已经发生的工作线程,然后退出。

此 Windows 服务在 Win7 上运行良好。我已经在 Win10 上安装了几次并且运行良好 - 直到昨天我看到一个日志文件,其中显示工作线程已按预期在 AutoResetEvent 上被阻止,但是:那个工作线程从未到达我的下一条语句程序。它从未醒来,没有执行另一条语句。阻塞 94 秒后,服务结束。

请注意,在这种情况下,我的 OnStop 方法 没有被调用

整个进程还没有被终止 - 有一个线程进入 (threadID 1) 大概来自 SCM 或 OS,它会阻塞直到我的服务终止 - 线程在退出时记录了一些消息。

这是我的问题:是否存在 Windows 服务控制管理器 (SCM) 认为有必要实际终止应用程序线程的情况?谁能解释为什么我的帖子死了?

对原始问题的简短回答

我发现重启机器会导致我的线程死掉(有趣的是 Windows 分配的线程并没有死掉,它只是退出了——我想这就是 SCM 在被告知时清理服务的方式关闭)。

更长的答案 - 现在我有一个新问题

我没有意识到我找错了树。我的客户端应用程序说该服务不可用,我认为这是因为我上面描述的 - 因为它被杀死了。

不是问题 - 问题是一旦服务停止(因为关闭),它就不会再次重新启动!

为什么我的 .NET 4 Automatic 服务在 Win10 中没有自动启动?那是一个不同的问题。

新答案

自发布我的原始问题后,我发现了几个回答新问题的帖子:

  • Automatic Windows 10 service doesn't start up
  • Automatic Services don't start automatically after windows restart
  • Automatic Services not starting on Win10 upgrade machine

    所以诊断是 Win10 正在执行某种组合,减慢我的 .NET 4 服务的启动速度,然后通过在它可以开始执行我的代码之前将其杀死来惩罚启动缓慢的服务。

    我确实找到了支持这一点的系统事件日志条目。

    我的解决方案是将 "start type" 从 "Automatic" 更改为 "Automatic (Delayed)"。

    我的一些相关链接:

  • Automatic vs Automatic Delayed Start
  • 我希望所有这些对其他人有所帮助。