【发布时间】:2010-09-13 08:10:55
【问题描述】:
问题陈述
我有一个工作线程,它基本上扫描一个文件夹,进入其中的文件,然后休眠一段时间。扫描操作可能需要 2-3 秒,但不会更多。我正在寻找一种优雅地停止这个线程的方法。
澄清:我想在线程睡眠而不是扫描时停止线程。但是,问题是我不知道线程的当前状态是什么。如果它正在睡觉,我希望它立即退出。如果它正在扫描,我希望它在它试图阻止的那一刻退出。
尝试解决方案
起初我使用的是睡眠和中断。然后我发现中断并没有真正中断睡眠——它只在线程试图进入睡眠时起作用。
所以我切换到 Monitor Wait&Pulse。然后我发现 Pulse 仅在我实际处于等待状态时才有效。所以现在我有一个看起来像这样的线程:
while (m_shouldRun)
{
try
{
DoSomethingThatTakesSeveralSeconds();
lock (this)
{
Monitor.Wait(this, 5000);
}
}
catch (ThreadInterruptedException)
{
m_shouldRun = false;
}
}
现在我需要制作我的停止功能。所以我开始了:
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);
}
}
}
问题
首选方法是什么?有没有第三种更好的方法?
【问题讨论】:
-
"起初我使用的是 Sleep 和 Interrupt。后来我发现 Interrupt 并没有真正中断 Sleep - 它只在线程尝试进入睡眠状态时才起作用。”这很奇怪。这是一个已知的错误?如果不是,您可以尝试用玩具示例重现它吗?
标签: c# multithreading