我需要停止一个线程,但如果它应该睡眠8秒,我想中止它,它将继续睡眠8秒,然后才停止。
答案 0 :(得分:13)
ManualResetEvent mre=new ManualResetEvent(false);
//......
var signalled=mre.WaitOne(TimeSpan.FromSeconds(8));
if(!signalled)
{
//timeout occurred
}
其他地方(在8秒钟之前):
mre.Set(); //unfreezes paused Thread and causes signalled==true
并允许未阻止的线程正常终止。 Thread.Abort
为evil and should be avoided。
答案 1 :(得分:7)
在线程处于睡眠状态时,您无法(安全地)中止线程。您应该在阻止完成后立即检查中止情况,然后在此时退出。
在大多数情况下,确实没有任何不利之处,因为线程在被阻止时将使用非常少的资源。
如果你必须尽快“中止”,你可以使用不同的阻止机制。睡眠很少是正确的选择 - 等待句柄可能会提供相同的功能,并为另一个线程提供一种方法,表明它应立即停止阻塞。
答案 2 :(得分:5)
考虑使用System.Timers.Timer
类。这是一个可以在需要时停止的计时器。
您可以找到一些好的说明here
答案 3 :(得分:2)
使用AutoResetEvent timed Wait代替Sleep
,当您希望中断等待的线程时,使用AutoResetEvent发信号通知Set,否则计时器到期。