在C#多個線程運行的過程中,會遇到先運行哪個線程和後運行哪個線程的問題,這需要用到ManualResetEvent類。
ManualResetEvent類允許不同線程通過互發信號和等待彼此的信號來達到線程同步的目的。
它有三個重要的方法:Reset、Set和WaitOne。
首先要初始化一個ManualResetEvent類,可定義如下:
private ManaulResetEvent allDone=new ManaulResetEvent(false);
我們會看到在初始化時,有一個false參數,這是什麼意思呢?它的意思是:初始化allDone爲非終止狀態,當有線程調用allDone.WaitOne()方法時,該線程將進入阻塞狀態。
如果將false改爲true,則會初始化allDone爲終止狀態,當有線程調用allDone.WaitOne()方法時,該線程可以繼續執行後面的操作。
再說一下Reset方法,它會將ManualResetEvent類的對象(此處爲allDone)設置爲非終止狀態,告訴調用allDone.WaitOne()方法的線程:此處將阻塞線程。
Set方法與Reset相反,當有線程調用allDone.Set()方法時,它會告訴包含allDone.WaitOne()方法的線程:此處改爲了終止狀態,程序可以繼續運行了。