c# - 如何在给定点停止线程?

标签 c# multithreading

我试图停止一些线程,阅读一些有关优雅地执行此操作的正确方法的内容,但我一定是做错了什么,因为它根本不起作用。起初我尝试不使用 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() 处设置了一个断点,即使我传入了 Stop()_IsRunnig 仍然为真。

最佳答案

这里需要锁,因为你的 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 在线程启动之前停止。

关于c# - 如何在给定点停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694804/

相关文章:

c# - 拖放后将 div 保存到图像

c# - 我可以在 Raspberry Pi 4 上使用 .NET SIMD 吗?

c# - C#中的具体组合,无法掌握

c# - Sql中如何替换select语句中的列值?

c# - 枚举组合的设计模式(方法参数)

java - 让 1 个线程等待一组线程完成

c++ - 如何编译Boost多线程程序?

C++ boost 线程 : having a worker thread pause and unpause based on mutexes/conditions using a concurrent queue

并发/异步调用和数据竞争的 Javascript/JQuery 处理

android - 最佳实践 : Update ArrayAdapter continuously