用單線程的思維去寫多線程,真是頭痛呀
C#中多線程很方便,但是遇到復雜點的任務,同步成了大問題,google到一大堆的方法:
lock
monitor
信號量AutoResetEvent和ManualResetEvent
mutex
都試過了,可是卻總是同步不了,總會有線程在競爭,單線測試沒任何問題,多線是的問題總是莫名其妙
VS的調試器在多線程下調試幾乎能讓人崩潰
後來冷靜下來,終於想明白是怎麼回事了:
要轉變思路,多線程中的代碼始終處於競爭狀態,也就是CPU在不斷輪詢,其實CPU始終如此,只不過多線更明顯而已
想要讓代碼按順序執行,可以利用一個輔助線程,不斷查詢多線程的狀態
在需要的時候可以利用讓ManualResetEvent線程waitone(),輔助線程查詢到所有線程狀態均為
WaitSleepJoin時,就可以去執行你需要的代碼,這樣就能完成同步
以下為ThreadState定義的枚舉常數
成員名稱
說 明
Aborted
線程處於Stopped狀態中
AbortRequested
已對線程調用了Thread.Abort方法,但線程尚未收到試圖終止它的掛起的System.Threading. ThreadAbortException
Background
線程正作為後台線程執行(相對於前台線程而言)。此狀態可以通過設置Thread.IsBackground屬性來控制
Running
線程已啟動,它未被阻塞,並且沒有掛起的ThreadAbortException
Stopped
線程已停止
StopRequested
正在請求線程停止。這僅用於內部
Suspended
線程已掛起
SuspendRequested
正在請求線程掛起
Unstarted
尚未對線程調用Thread.Start方法
WaitSleepJoin
由於調用Wait、Sleep或Join,線程已被阻止
摘自 rztyfx的專欄