Nejprve si pojďme probrat ManualResetEvent a během diskuse vložím nějaký obsah AutoResetEvent, abychom porovnali:
ManualResetEvent může blokovat jedno nebo více vláken, dokud není přijat signál, který ManualResetEvent vyzývá, aby přestal blokovat aktuální vlákno.
Informace o ManualResetEvent
Představte si, že objekt ManualResetEvent má vlastnost Booleovského typu, IsRelease, která řídí, zda má aktuální vlákno zablokovat. Tuto vlastnost můžeme nastavit při inicializaci, například ManualResetEvent event=new ManualResetEvent(false); To naznačuje, že výchozí vlastností je blokovat aktuální vlákno.
Příklad kódu:
Všimněte si důležitého rozdílu mezi ManualResetEvent a AutoResetEvent:
Manuál určitě pošle signál jak do vlákna 1, tak do vlákna 2,Automatické vysílání pošle signál jen jednomu z nich náhodně.
Proč se jeden jmenuje manuální a druhý automatický? Myslím, že je to otázka, kterou má mnoho lidí, a teď se na ni podíváme.
Jen now_manualResetEvent. set(); Myslím, že každý chápe tuto větu, kterou lze považovat za nastavení vlastnosti IsRelease na pravdivou
_manualResetEvent.WaitOne(); Vlákno 1 už neblokuje po přijetí signálu. Hodnota IsRelease je pravdivá po celý proces poté.Když
Pokud chcete vrátit hodnotu IsRelease na false, musíte znovu zavolat metodu _manualResetEvent.Reset().
Pokud je to _autoResetEvent.set(), pak _autoResetEvent.WaitOne() automaticky nastaví hodnotu IsRelease na false.
Proto se jedna jmenuje automatická a druhá manuální.
Testovací kód:
|