gpt4 book ai didi

c# - 如何在 C# 中正确终止工作线程

转载 作者:太空狗 更新时间:2023-10-29 19:56:26 25 4
gpt4 key购买 nike

问题陈述

我有一个工作线程,它基本上扫描一个文件夹,进入其中的文件,然后休眠一段时间。扫描操作可能需要 2-3 秒,但不会更长。我正在寻找一种优雅地停止此线程的方法。

澄清:我想在线程休眠时停止线程,而不是在扫描时停止线程。但是,问题是我不知道线程的当前状态是什么。如果它正在 sleep ,我希望它立即退出。如果它正在扫描,我希望它在尝试阻止时退出。

尝试解决方案

起初我使用的是 sleep 和中断。然后我发现中断并没有真正中断 sleep ——它只在线程试图进入休眠状态时才起作用。

所以我切换到 Monitor Wait&Pulse。然后我发现 Pulse 只有在我真正处于等待状态时才有效。所以现在我有一个看起来像这样的线程:

while (m_shouldRun)
{
try
{
DoSomethingThatTakesSeveralSeconds();
lock (this)
{
Monitor.Wait(this, 5000);
}
}
catch (ThreadInterruptedException)
{
m_shouldRun = false;
}
}

现在我需要设计我的 Stop 函数。所以我开始:

public void Stop()
{
m_shouldRun = false;
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}

但这不起作用,因为我可能在线程工作时(在它不等待时)发出脉冲。所以我添加了中断:

public void Stop()
{
m_shouldRun = false;
thread.Interrupt();
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}

另一种选择是使用:

public void Stop()
{
m_shouldRun = false;
while (!thread.Join(1000))
{
lock (this)
{
Monitor.Pulse(this);
}
}
}

问题

首选方法是什么?是否有第三种方法更可取?

最佳答案

优雅地停止线程的方法是让它自己完成。所以在 worker 方法中你可以有一个 bool 变量来检查我们是否要中断。默认情况下,它将设置为 false,当您从主线程将其设置为 true 时,它将通过中断处理循环来简单地停止扫描操作。

关于c# - 如何在 C# 中正确终止工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3698731/

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