首页 > 解决方案 > 为什么 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-10windows-services

解决方案


对原始问题的简短回答

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

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

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

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

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

新答案

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


推荐阅读