我有一个Windows服务,它使用生产者/消费者队列模型,多个工作线程处理队列中的任务.这些任务可以运行很长时间,如果不是几小时,则按很多分钟的顺序运行,并且不涉及循环.
我的问题是关于处理服务停止以在这些工作线程上优雅地结束处理的最佳方法.我在另一个SO问题中读到,使用thread.Abort()是设计不良的标志,但似乎服务OnStop()方法在服务终止之前只有有限的时间完成.我可以在catchA中为ThreadAbortException做足够的清理(没有不一致状态的危险)所以在工作线程上调用thread.Abort()对我来说似乎没问题.是吗?有哪些替代方案?
的确,Abort
应该避免.最好给他们一些时间优雅地退出 - 然后也许在超时后,可能考虑中止他们 - 但最终,服务停止可以通过杀死进程来做同样的事情.
我会尝试在我的队列中发出一个"刷新并退出"的信号 - 就像这里的Close
方法一样,但是在完成时会有某种信号.
如果你诉诸Abort
- 考虑这个过程致命受伤.尽快杀死它.
为"shutdown"创建一个任务类型,并为每个工作线程将其注入生产者/消费者队列一次.
然后使用Thread.Join(具有超时)以确保关闭已完成.