Najskôr sa pozrime na ManualResetEvent a počas diskusie vložím aj časť obsahu AutoResetEvent, aby som porovnal:
ManualResetEvent môže blokovať jedno alebo viac vlákien, kým nie je prijatý signál, ktorý ManualResetEvent naznačí, aby prestal blokovať aktuálne vlákno.
Informácie o ManualResetEvent
Predstavte si, že objekt ManualResetEvent má vlastnosť Booleovského typu, IsRelease, ktorá ovláda, či má zablokovať aktuálne vlákno. Túto vlastnosť môžeme nastaviť pri inicializácii, napríklad ManualResetEvent event=new ManualResetEvent(false); To naznačuje, že predvolenou vlastnosťou je blokovať aktuálne vlákno.
Príklad kódu:
Všimnite si dôležitý rozdiel medzi ManualResetEvent a AutoResetEvent:
Manuál určite pošle signál na vlákno 1 aj vlákno 2,Auto pošle signál len jednému z nich náhodne.
Prečo sa jedna volá manuálna a druhá automatická? Myslím, že toto je otázka, ktorú má veľa ľudí, a teraz sa na ňu pozrieme.
Len now_manualResetEvent. set(); Myslím, že každý rozumie tejto vete, ktorú možno považovať za nastavenie vlastnosti IsRelease na pravdivé
_manualResetEvent.WaitOne(); Vlákno 1 už neblokuje po prijatí signálu. Hodnota IsRelease je pravdivá počas celého procesu potom.Ak
Ak chcete vrátiť hodnotu IsRelease na false, musíte znova zavolať metódu _manualResetEvent.Reset().
Ak je to _autoResetEvent.set(), potom _autoResetEvent.WaitOne() automaticky nastaví hodnotu IsRelease na false.
Preto sa jeden volá automatický a druhý manuálny.
Testovací kód:
|