我有一个Windows服务,该服务使用生产者/消费者队列模型以及多个工作线程来处理队列中的任务。这些任务的运行时间可能非常长,如果不是几个小时,则可能需要数分钟的时间,并且不涉及循环。
我的问题是处理服务停止以正常结束这些工作线程上的处理的最佳方法。我在另一个SO question中已经读到,使用thread.Abort()表示设计不好,但是看来服务OnStop()方法在终止服务之前只获得了有限的时间来完成。我可以在ThreadAbortException的捕获中进行足够的清理(不存在状态不一致的危险),因此在工作线程上调用thread.Abort()对我来说似乎还可以。是吗?有哪些选择?
最佳答案
实际上,应避免使用Abort
。最好给他们一些时间优雅地退出-然后也许在超时后,或考虑中止它们-但最终,服务停止可以通过终止进程来实现相同的目的。
我会尝试在队列中发出一个“刷新并退出”的信号-非常类似于Close
方法here,但在完成时会带有某种信号。
如果诉诸Abort
,请考虑该过程是否致命。尽快杀死它。
关于.net - 如何在服务停止时停止多线程Windows服务中的工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/704991/