windows-10 - 为什么 Windows 10 在我的 Windows 服务中杀死了我的工作线程?
问题描述
我已经使用 Visual Studio 2015 在 .NET 4 和 C# 中实现了一个 Windows 服务。在该OnStart
方法中,我的服务创建了一个循环的“工作线程”,阻塞在一个AutoResetEvent
(连接到一个Timer
)上。“工作线程”也有一个CancellationTokenSource
它手动轮询以检查它是否应该停止工作。该OnStop
方法首先使用 CancellationTokenSource 取消,然后使用 AutoResetEvent 发出信号,唤醒注意到“取消”已经发生的 Worker 线程,然后退出。
此 Windows 服务在 Win7 上运行良好。我已经在 Win10 上安装了几次,它运行良好 - 直到昨天我看到一个日志文件,它说工作线程按预期阻止了 AutoResetEvent,但是:那个工作线程从未到达我的下一条语句程序。它从未醒来,没有执行另一条语句。阻塞94秒后,服务结束。
请注意,在这种情况下,我的OnStop
方法没有被调用。
整个进程没有被杀死 - 有一个线程(threadID 1)可能来自 SCM 或操作系统,并且在我的服务终止之前一直阻塞 -该线程在退出时记录了一些消息。
这是我的问题:是否存在 Windows 服务控制管理器 (SCM) 认为有必要实际终止应用程序线程的情况?谁能解释为什么我的线程死了?
解决方案
对原始问题的简短回答
我发现重新启动机器导致我的线程死亡(有趣的是,Windows 分配的线程并没有死亡,它只是退出了——我猜这就是 SCM 在被告知关闭时清理服务的方式)。
更长的答案 - 现在我有一个新问题
我没有意识到我在叫错树。我的客户端应用程序说该服务不可用,我认为这是因为我上面描述的 - 因为它被杀死了。
不是问题- 问题是一旦服务停止(因为关闭),它就不会再次重新启动!
那么为什么我的 .NET 4Automatic
服务没有在 Win10 中自动启动呢?那是一个不同的问题。
新答案
自从发布我的原始问题以来,我发现了几个回答新问题的帖子:
- 自动 Windows 10 服务未启动
- Windows 重新启动后自动服务不会自动启动
-
因此,诊断结果是 Win10 正在执行某种组合,即减慢我的 .NET 4 服务的启动速度,然后通过在它可以开始执行我的代码之前将其杀死来惩罚它的缓慢启动。
我确实找到了支持这一点的系统事件日志条目。
对我来说,解决方案是将我的“启动类型”从“自动”更改为“自动(延迟)”。
一些对我来说相关的链接:
- 自动与自动延迟启动
-
我希望所有这些都可以帮助其他人。
推荐阅读
- rest - Outlook 日历插件:如何从分发列表中获取地址(在 item.requiredAttendees 中)
- python-3.x - 查看 netCDF4 文件
- pandas - 具有特定分隔符的 pandas.DataFrame 中多行的按列字符串连接
- google-apps-script - 在 Google Apps 脚本中检查 JSON 密钥中是否包含数据
- google-visualization - 谷歌图表线,将多个工具提示合二为一
- google-cloud-platform - 在源代码更改后,使用 gcloud 进行 Cloud Run 本地开发仍会提供旧代码
- debugging - MPLAB X 和谐调试器
- javascript - Vimeo API - player.addCuePoint 不是函数
- r - 替换多列中的字符
- javascript - Angular //innerHTML 数据绑定