启动和停止(强制)线程作业

我想知道一种正确的方法来启动和停止强制和非强制的线程作业。 这是停止线程的正确方法吗?

public class ProcessDataJob : IJob { private ConcurrentQueue _dataQueue = new ConcurrentQueue(); private volatile bool _stop = false; private volatile bool _forceStop = false; private Thread _thread; private int _timeOut = 1000; public void Start() { _stop = false; _forceStop = false; _thread = new Thread(ProcessData); _thread.Start(); } private void ProcessData() { while (!_stop || _dataQueue.Count > 0) { if(_forceStop) return; byte[] data; if(_dataQueue.TryDequeue(data)) { //Process data //.....// } } } public void Stop(bool force) { _stop = true; _forceStop = force; _thread.Join(_timeOut); } public void Enqueue(byte[] data) { _dataQueue.Enqueue(data); } } 

没有正确的方法来强行杀死一个线程。

有几种方法可以做到,但没有一种方法是正确的

只有当你需要终止程序,或者卸载包含该线程的appdomain时,你才应该强行杀死一个线程,并且不关心任何在损坏/坏/锁定状态下悬空的数据结构,因为它们将是也在短时间内消失了。

在互联网上有很多关于Thread.Abort是多么糟糕/邪恶的建议,所以不要这样做。

相反,写出适当的合作线程。 线程应该自己检查一个标志(事件,挥发性bool字段等),然后在很好地要求时自愿退出。

这是正确的方法。

这是我过去做过的方式,但有一点不同。 我的线程在过去意外地挂了,这意味着你的那个循环没有回复。 为了解决这个问题,我有所有使用类的线程,像你一样,注册一个’经理’类,负责参与像Forced Stop这样的关键事情。 线程类具有对管理器的引用,并且当强制停止时,它调用管理器上的方法,该方法实际上是计时器。 如果在计时器关闭时,线程类没有将状态标志设置为STOPPED,则管理器会调用中止。

对我来说关键的不仅仅是呼叫“停止”,而是确认“停止”已经发生,并且理解这将是一个非确定性的时间量,但是“在一段合理的时间之后”我应该给予起来继续前进。

您可以使用.NET ThreadPool类,这样您就不必自己处理堆栈。