我想知道一個正確的方式來啓動和停止強制和非強制的線程作業。這是停止線程的正確方法嗎?啓動和停止(強制)線程作業
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);
}
}
+1我完全同意你的觀點,並且OP已經是doint了:-)那麼,什麼時候使用'Thread.Abort'甚至可以想象?也許從未? –
如果你需要卸載appdomain(想殺死一個正在運行的擴展/插件)或者退出程序,並且你知道/不在乎有沒有線程運行時沒有配置IsBackground屬性。基本上,你想快速擺脫appdomain /應用程序,不希望等待所有線程自行退出。儘管如此,說實話,即使在這種情況下,我可能仍然不會使用Thread.Abort。把它看作是一個操作系統的功能,對於我們這些凡人來說,這個功能基本上太低了。讓Eric Lippert和其他人來照顧它吧。 –
是的,爲此我會使用'AppDomain.Unload'(在封面下使用'Thread.Abort')。 –