Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 17115|Odpověď: 0

[Komunikace] Podrobné vysvětlení AutoResetEvent v .net/c#

[Kopírovat odkaz]
Zveřejněno 20.03.2018 13:19:01 | | |

Koncepty související s vlákny
1. Synchronizace vláken
ManuálníResetUdálost
Metoda Set() nastavuje stav na Signalizovaný
Reset() nastav na žádný signál
WaitOne() bude blokovat, dokud nebude mít signál, a pokud je signál v době volání WaitOne, nebude blokován
AutoResetEvent
Rozdíl oproti ManualResetEvent je v tom, že AutoResetEvent.WaitOne() automaticky mění stav objektu události, tedy stav události se mění pokaždé, když je AutoResetEvent.WaitOne() vykonán. Signál - > žádný signál; Žádný signál – > má signál
example:


  
myResetEven.Set(), což je ve skutečnosti ekvivalent switche, pokud metoda set() není vykonána, následující waitOne() nebude moci počkat na oznámení, aby ji umožnilo spustit, takže příkaz po waitOne nebude vykonán.
Metoda monitorování
Mechanismus Wait() Pulse() se používá pro interakci mezi vlákny; když objekt vysílá Monitor.Wait(), vlákno, které k objektu přistupuje, zůstane ve stavu čekaní. dokud nedostane signál k probuzení. Monitor.Pulse() se používá k posílání signálů do čekajícího vlákna.
To znamená, že v kritické oblasti mezi Monitor.Enter() a Monitor.Exit(), aby se uvolnil zámek objektu a zablokovalo aktuální vlákno, je ve frontě v čekací fázi.

Lock je jiný než Mutex
Synchronizace zámku mezi více vlákny
Synchronizace více vláken mezi procesy Mutex nebo synchronizace více procesů
V .Net vícevláknovém programování se často používají třídy AutoResetEvent a ManualResetEvent, jejichž použití je velmi podobné, ale existují rozdíly. Metoda Set přemístí signál do odesílacího stavu, metoda Reset ho přemístí do stavu neodesílání a WaitOne čeká, až bude signál odeslán. Počáteční stav konstruktoru lze určit hodnotou parametru, pokud je true, není blokující, a false je blokující stav. Pokud vlákno zavolá metodu WaitOne, vlákno dostane signál, když je ve stavu odesílání, a pokračuje v provádění směrem dolů. Rozdíl je v tom, že po volání AutoResetEvent.WaitOne() povoluje vstup pouze jednomu vláknu najednou, a když vlákno dostane signál, AutoResetEvent automaticky přeřadí signál do stavu bez odeslání, zatímco ostatní vlákna volající WaitOne mohou pouze pokračovat v čekání. To znamená, že AutoResetEvent probouzí pouze jedno vlákno najednou; ManualResetEvent může probudit více vláken, protože když jedno vlákno zavolá metodu ManualResetEvent.Set(), ostatní vlákna volající WaitOne dostanou signál k pokračování ve vykonání a ManualResetEvent automaticky nenastaví signál na neodesílání. Jinými slovy, pokud není metoda ManualResetEvent.Reset() vyvolána ručně, ManualResetEvent zůstane signalizován a ManualResetEvent může současně probudit více vláken pro pokračování v vykonání.




Předchozí:.har nástroj pro parsování souborů a HARViewer
Další:Implementace distribuovaného zámku Zookeeper
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com