.net - 如何在服务停止时停止多线程Windows服务中的工作线程

标签 .net multithreading windows-services

我有一个Windows服务,该服务使用生产者/消费者队列模型以及多个工作线程来处理队列中的任务。这些任务的运行时间可能非常长,如果不是几个小时,则可能需要数分钟的时间,并且不涉及循环。

我的问题是处理服务停止以正常结束这些工作线程上的处理的最佳方法。我在另一个SO question中已经读到,使用thread.Abort()表示设计不好,但是看来服务OnStop()方法在终止服务之前只获得了有限的时间来完成。我可以在ThreadAbortException的捕获中进行足够的清理(不存在状态不一致的危险),因此在工作线程上调用thread.Abort()对我来说似乎还可以。是吗?有哪些选择?

最佳答案

实际上,应避免使用Abort。最好给他们一些时间优雅地退出-然后也许在超时后,考虑中止它们-但最终,服务停止可以通过终止进程来实现相同的目的。

我会尝试在队列中发出一个“刷新并退出”的信号-非常类似于Close方法here,但在完成时会带有某种信号。

如果诉诸Abort,请考虑该过程是否致命。尽快杀死它。

关于.net - 如何在服务停止时停止多线程Windows服务中的工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/704991/

相关文章:

.net - 无法在 Visual Studio 中构建解决方案出现错误 'child node 2 exited prematurely'

c# - 在c#中水平附加字符串

c# - 使用服务更换壁纸

deployment - 部署 Windows 服务的最佳实践

c# - 使用 linq to Entity 框架按日期读取最近插入的行

c# - 在 C# 2.0 中使用 Console.Write 在相同位置写入字符串

python - 在python中运行后台线程

c# - 多线程sqldatareader时间过期

python - Concurrent.futures 使用指南——同时使用线程和处理的简单示例

Windows 无法在 Windows Server 2008 SP1 上启动本地计算机上的服务错误 1067