Beszéljünk először a ManualResetEventről, és a beszélgetés során összefűzöm az AutoResetEvent tartalmat, hogy összehasonlítsam:
A ManualResetEvent blokkolhat egy vagy több szálat, amíg egy jel nem érkezik, amely arra figyelmezteti a ManualResetEvent-et, hogy hagyja abba a jelenlegi szál blokkolását.
Információk a ManualResetEventről
Képzeljük el, hogy a ManualResetEvent objektumnak van egy Boolean típusú tulajdonsága, az IsRelease, amely szabályozza, hogy blokkolja-e a jelenlegi szálat. Ezt a tulajdonságot beállíthatjuk inicializáláskor, például ManualResetEvent event=new ManualResetEvent(false); Ez azt jelzi, hogy az alapértelmezett tulajdonság a jelenlegi szál blokkolása.
Kód példa:
Fontos különbséget figyelj meg a ManualResetEvent és az AutoResetEvent között itt:
A kézikönyv biztosan jelet küld mind az 1-es, mind a 2-es szálnak,Az automatikus csak véletlenszerűen küld jelet az egyiküknek.
Miért hívják az egyiket manuálisnak, a másikat automatának? Úgy gondolom, ez egy olyan kérdés, amit sokan felmerülnek, és most ezt vizsgáljuk.
Csak now_manualResetEvent. Set(); Szerintem mindenki érti ezt a mondatot, ami úgy tekinthető, hogy az IsRelease tulajdonságát igazra állítja
_manualResetEvent.WaitOne(); Már nem blokkolja az 1-es szálat jel érkezése után. Az IsRelease értéke az egész folyamat alatt igaz.Ha
Ha vissza akarod állítani az IsRelease értékét false-ra, újra hívnod kell a _manualResetEvent.Reset() metódust.
Ha _autoResetEvent.set(), akkor a _autoResetEvent.WaitOne() automatikusan állítja be az IsRelease értékét hamisnak.
Ezért hívják az egyiket automatának, a másikat manuálisnak.
Tesztkód:
|