当前位置:  开发笔记 > 编程语言 > 正文

如何在给定点停止线程?

如何解决《如何在给定点停止线程?》经验,为你挑选了1个好方法。

我试图阻止一些线程,阅读一些关于正确地执行它的正确方法的事情,但我必须做错了什么因为它根本不起作用.起初,我试着不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().



1> Reed Copsey..:

由于你的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停止.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有