1. 程式人生 > >【.NET】執行緒的暫停和掛起

【.NET】執行緒的暫停和掛起

C#中使得多執行緒暫停掛起的方法有多種,但各有不同。我逐個說明:

sleep方法是個靜態方法,由thread類來呼叫。它只能暫停當前執行緒,不能暫停其他執行緒。它接受的引數指名這個執行緒需要休眠多少時間。

suspend方法是普通方法,由物件呼叫,他不但能夠終止當前執行緒,還能夠終止其他執行緒。與 Thread.Sleep 不同,Thread.Suspend 不會使執行緒立即停止執行。公共語言執行庫必須一直等待,直到執行緒到達安全點之後它才可以將該執行緒掛起。如果執行緒尚未啟動或已經停止,則它將不能掛起。執行緒的安全點是執行緒執行過程中可執行垃圾回收的一個點。但是它具有高度侵犯性並會導致嚴重的應用程式問題,如死鎖(例如,如果掛起的執行緒佔有另一個執行緒需要的資源,就會發生這種情況)。某些應用程式確實需要控制執行緒的優先順序以提高效能。為了做到這一點,應該使用 Thread.Priority 而不是 Thread.Suspend。

join方法是非靜態方法,他使得在系統呼叫此方法時只有這個執行緒執行完後,才能執行其他執行緒,包括主執行緒的終止!或者給它制定時間,即最多過了這麼多時間後,如果還是沒有執行完,下面的執行緒可以繼續執行而不必再理會當前執行緒是否執行完。

所以,最好不要使用suspend方法來掛起執行緒,綜合使用sleep join priority 都是很好的解決辦法。