gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:47:25 25 4
gpt4 key购买 nike

我试图停止一些线程,阅读一些有关优雅地执行此操作的正确方法的内容,但我一定是做错了什么,因为它根本不起作用。起初我尝试不使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com