Najpierw omówmy ManualResetEvent, a podczas dyskusji wplatę trochę treści AutoResetEvent, aby porównać:
ManualResetEvent może blokować jeden lub więcej wątków, aż do otrzymania sygnału nakazującego ManualResetEvent zaprzestanie blokowania bieżącego wątku.
Informacje o ManualResetEvent
Wyobraź sobie, że obiekt ManualResetEvent ma właściwość typu Boole'a, IsRelease, która decyduje, czy blokować bieżący wątek. Możemy ustawić tę właściwość podczas inicjalizacji, na przykład ManualResetEvent event=new ManualResetEvent(false); Oznacza to, że domyślną właściwością jest blokowanie bieżącego wątku.
Przykład kodu:
Zwróć uwagę na ważną różnicę między ManualResetEvent a AutoResetEvent:
Manual na pewno wyśle sygnał zarówno do gwintu 1, jak i 2,Auto wysyła sygnał tylko do jednego z nich losowo.
Dlaczego jeden nazywa się manualem, a drugi automatem? Myślę, że to pytanie, które zadaje wiele osób, a teraz się do niego przyjrzymy.
Po prostu now_manualResetEvent. set(); Myślę, że wszyscy rozumieją to zdanie, które można uznać za ustawienie właściwości IsRelease na prawdziwe
_manualResetEvent.WaitOne(); Nie blokuje już wątku 1 po odebraniu sygnału. Wartość IsRelease jest prawdziwa przez cały kolejny proces.Jeśli
Jeśli chcesz przywrócić wartość IsRelease do false, musisz ponownie wywołać metodę _manualResetEvent.Reset().
Jeśli jest to _autoResetEvent.set(), to _autoResetEvent.WaitOne() automatycznie ustawi wartość IsRelease na false.
Dlatego jeden nazywa się automatyczny, a drugi manualnym.
Kod testowy:
|