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

Windows 10 为什么Windows 10在我的Windows服务中杀死我的工作线程?,windows-10,windows-services,Windows 10,Windows Services,我使用Visual Studio 2015在.NET 4和C#中实现了Windows服务。在OnStart方法中,我的服务创建一个“工作线程”,该线程在AutoResetEvent上循环、阻塞(连接到计时器)。“工作线程”还有一个CancellationTokenSource,它可以手动轮询以检查是否应该停止工作。OnStop方法首先使用CancellationTokenSource取消,然后使用AutoResetEvent发出信号,唤醒工作线程,该线程注意到“取消”已经发生,然后退出 此Win

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

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

请注意,在这个场景中,没有调用我的
OnStop
方法

进程作为一个整体并没有被终止——有一个线程(threadID 1)可能来自SCM或OS,它会一直阻塞直到我的服务终止——该线程在退出时记录了一些消息

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

对原始问题的简短回答 我发现重新启动机器导致我的线程死亡(有趣的是,Windows分配的线程没有死亡,它只是退出了-我想这就是SCM在被告知关闭时清理服务的方式)

更长的答案-现在我有一个新问题 我没意识到我找错人了。我的客户端应用程序说这项服务不可用,我认为这是因为我上面所说的——因为它正在消亡

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

那么为什么我的.NET4
Automatic
服务没有在Win10中自动启动呢?那是另一个问题

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

  • 因此,诊断结果是Win10在某种程度上减缓了我的.NET4服务的启动速度,然后在该服务开始执行我的代码之前将其杀死,以惩罚该服务启动缓慢

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

    我的解决方案是将“启动类型”从“自动”更改为“自动(延迟)”

    以下是我的一些相关链接:

  • 我希望这一切能帮助其他人