我试图阻止一些线程,阅读一些关于正确地执行它的正确方法的事情,但我必须做错了什么因为它根本不起作用.起初,我试着不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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在设置断点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;
}
}
Run Code Online (Sandbox Code Playgroud)
这将保护您免于启动2个线程,并且还会在线程启动之前阻止Stop停止.