如何在线程休眠时中止线程

时间:2011-04-26 16:12:02

标签: c#

我需要停止一个线程,但如果它应该睡眠8秒,我想中止它,它将继续睡眠8秒,然后才停止。

4 个答案:

答案 0 :(得分:13)

使用ManualResetEvent

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.Abortevil and should be avoided

答案 1 :(得分:7)

在线程处于睡眠状态时,您无法(安全地)中止线程。您应该在阻止完成后立即检查中止情况,然后在此时退出。

在大多数情况下,确实没有任何不利之处,因为线程在被阻止时将使用非常少的资源。

如果你必须尽快“中止”,你可以使用不同的阻止机制。睡眠很少是正确的选择 - 等待句柄可能会提供相同的功能,并为另一个线程提供一种方法,表明它应立即停止阻塞。

答案 2 :(得分:5)

考虑使用System.Timers.Timer类。这是一个可以在需要时停止的计时器。

您可以找到一些好的说明here

答案 3 :(得分:2)

使用AutoResetEvent timed Wait代替Sleep,当您希望中断等待的线程时,使用AutoResetEvent发信号通知Set,否则计时器到期。