2011-04-26 68 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