Suspend()
- 在C#中,線程的掛起可以使用suspend()方法。可此方法早就被官方強烈反對使用,因為你不知道suspend操作會使程序掛起在哪一行代碼,這很容易帶來一些意料之外的問題。在Visual Studio IDE中使用suspend會被提示“Thread.Suspend has been deprecated. Use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources."
不得不說微軟的文檔好!
- 文檔已經說地很清楚了,使用suspend,你不知道線程正在執行什么代碼。如果線程掛起在一個類型的構造函數里,而其他對象對這個類型的對象有所依賴,那么很容易造成死鎖。
- 這就是為什么如今的線程機制是cooperative model,需要線程自己去決定應該在哪里阻塞,而在那里阻塞由編寫代碼的人決定,這樣可以確保線程在被掛起時不會占據其它資源。比如
ManaulResetEvent
,給線程設置信號,線程在哪里掛起由WaitOne
的位置決定,也就是由程序員確定。