2011-04-26 47 views
3

我需要停止线程,但是如果它应该睡眠8秒,并且我想放弃它,它会继续睡眠8秒,然后停止。如何在睡眠中放弃线程

+1

不要紧,无论是在或睡眠后终止? – 2011-04-26 16:14:59

+0

你有没有考虑过唤醒它?即。使用一些会迫使它离开睡眠的东西? – 2011-04-26 16:15:25

+0

这是一个*真的*坏主意放弃线程。请参阅http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort – 2011-04-26 17:04:01

回答

6

你不能(安全地)在睡着时中止线程。您应该在阻止完成后立即检查您的中止条件,然后在该点退出。

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

如果您必须尽快“中止”,您可以使用不同的机制进行阻止。睡觉很少是正确的选择 - 等待句柄可能会提供相同的功能,并为其他线程发出信号指示它应该立即停止阻塞。

2

使用的AutoResetEvent timed Wait代替Sleep,信号使用Set当你想中断等待线程的AutoResetEvent,否则定时器超时。

12

使用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

+0

+1睡眠是很少需要的。 – 2011-04-26 17:02:42

5

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

你可以找到一些很好的说明here