我试图阻止一些线程,阅读一些关于正确地执行它的正确方法的事情,但我必须做错了什么因为它根本不起作用.起初,我试着不lock()
带_IsRunning
是挥发性的,然后用锁尝试.这就是我所拥有的.
private volatile bool _IsRunning; private static readonly object runLock = new object(); public void Start() { if (_IsRunning == true) return; _IsRunning = true; (new System.Threading.Thread(new System.Threading.ThreadStart(SendLoop))).Start(); } public void Stop() { lock (runLock) { _IsRunning = false; } } private void SendLoop() { while (_IsRunning) { lock (runLock) { if (_sockets.Count > 0) { //some stuff } else { System.Threading.Thread.Sleep(10); } } } }
我在设置断点while()
,并且_IsRunnig
仍然是即使我通过真实的Stop()
.
由于你的start方法的编写方式,这里需要锁定,但是,你只需要锁定Start()
(现在不是这样)Stop()
,因为它们是唯一可能导致你的情况发生竞争的因素.
我会SendLoop()
完全从你的方法中删除锁(它导致一个DeadLock,因为Stop
等待锁设置_isRunning
,你SendLoop
持有锁直到_isRunning
设置为false).现在,当你打电话时Stop()
,锁定会阻止它进行设置_isRunning = false;
但是,您Start()
和Stop()
方法中需要锁定(除非您按照完全构造的方式进行返工).就像是:
public void Start() { lock (runLock) { if (_IsRunning == true) return; _IsRunning = true; (new System.Threading.Thread(new System.Threading.ThreadStart(SendLoop))).Start(); } } public void Stop() { lock (runLock) { _IsRunning = false; } }
这将保护您免于启动2个线程,并且还会在线程启动之前阻止Stop停止.