如何在线程hibernate时中止线程

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

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

无论如何,在大多数情况下确实没有这个缺点,因为线程在被阻塞时将使用非常少的资源。

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

使用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.Abort是邪恶的,应该避免 。

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

你可以在这里找到一些好的指示

使用AutoResetEvent 定时等待而不是Sleep ,当您希望中断等待线程时,使用Set发出AutoResetEvent信号,否则定时器到期。