Ger*_*ard 3 .net c# multithreading
我想知道一种正确的方法来启动和停止强制和非强制的线程作业.这是停止线程的正确方法吗?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
没有正确的方法来强行杀死一个线程.
有几种方法可以做到,但没有一种方法是正确的.
只有当你需要终止程序,或者卸载包含该线程的appdomain时,你才应该强行杀死一个线程,并且不关心任何在损坏/坏/锁定状态下悬空的数据结构,因为它们将是也在短时间内消失了.
在互联网上有很多关于Thread.Abort是多么糟糕/邪恶的建议,所以不要这样做.
相反,写出适当的合作线程.线程应该自己检查一个标志(事件,挥发性bool字段等),然后在很好地要求时自愿退出.
这是正确的方法.
| 归档时间: |
|
| 查看次数: |
8096 次 |
| 最近记录: |