我想知道启动和停止强制和非强制线程作业的正确方法。这是停止线程的正确方法吗?
public class ProcessDataJob : IJob
{
private ConcurrentQueue<byte[]> _dataQueue = new ConcurrentQueue<byte[]>();
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);
}
}
最佳答案
没有正确的方法来强行终止线程。
有几种方法可以做到这一点,但没有一种是正确的。
只有当您需要终止程序或卸载包含该线程的应用程序域并且不关心任何处于损坏/错误/锁定状态的悬空数据结构时,才应该强行终止线程,因为他们也会在短时间内消失。
互联网上有很多关于 Thread.Abort 有多糟糕/邪恶的建议,所以不要这样做。
相反,编写适当的协作线程。线程应该自己检查一个标志(事件、volatile bool 字段等),然后在被很好地要求这样做时自愿退出。
这是正确的方式。
关于c# - 启动和停止(强制)线程作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146186/