Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 17115|Răspunde: 0

[Comunicare] Explicație detaliată a AutoResetEvent în .net/c#

[Copiază linkul]
Postat pe 20.03.2018 13:19:01 | | |

Concepte legate de fire
1. Sincronizarea firelor de execuție
ManualResetEvent
Metoda Set() setează starea la Signaled
Reset() pentru a-l seta la zero semnal
WaitOne() va bloca până când are semnal, iar dacă există semnal în momentul apelării WaitOne, nu va bloca
AutoResetEvent
Diferența față de ManualResetEvent este că AutoResetEvent.WaitOne() schimbă automat starea obiectului eveniment, adică starea evenimentului se schimbă de fiecare dată când AutoResetEvent.WaitOne() este executat. Semnal - > fără semnal; Fără semnal – > are semnal
example:


  
myResetEven.Set(), care este de fapt echivalent cu un switch, dacă metoda set() nu este executată, următorul waitOne() nu va putea aștepta notificarea pentru a o lăsa să se execute, astfel încât instrucțiunea de după waitOne să nu fie executată.
Metoda monitorului
Mecanismul Wait() Pulse() este folosit pentru interacțiunea între fire, când un obiect emite Monitor.Wait(), firul care accesează obiectul rămâne în stare de așteptare. Până primește un semnal de trezire. Monitor.Pulse() este folosit pentru a trimite semnale către firul de așteptare.
Adică, în zona critică dintre Monitor.Enter() și Monitor.Exit(), pentru a elibera blocarea obiectului și a bloca firul curent, acesta este în stare de așteptare în coadă.

Lock-ul este diferit de Mutex
Sincronizarea blocărilor între mai multe fire de execuție
Sincronizarea mai multor fire între procese Mutex sau sincronizarea mai multor procese
În programarea multithread .Net, clasele AutoResetEvent și ManualResetEvent sunt adesea folosite, iar utilizarea lor este foarte similară, dar există diferențe. Metoda Set pune semnalul în starea de trimitere, metoda Reset pune semnalul în starea non-trimitere, iar WaitOne așteaptă ca semnalul să fie trimis. Starea inițială a constructorului poate fi determinată de valoarea parametrului; dacă este adevărată, nu blochează, iar fals este starea de blocare. Dacă un fir apelează metoda WaitOne, acesta primește semnalul când este în starea de trimitere și continuă să execute în jos. Diferența este că după apel, AutoResetEvent.WaitOne() permite intrarea unui singur fir simultan, iar când un fir primește un semnal, AutoResetEvent va pune automat semnalul în stare fără trimitere, iar celelalte fire care apelează WaitOne pot doar să continue să aștepte. Adică, AutoResetEvent trezește doar un fir de discuție odată; ManualResetEvent poate trezi mai multe fire, deoarece atunci când un fir apelează metoda ManualResetEvent.Set(), celelalte fire care apelează WaitOne primesc semnalul pentru a continua execuția, iar ManualResetEvent nu setează automat semnalul să nu fie trimis. Cu alte cuvinte, dacă metoda ManualResetEvent.Reset() nu este numită manual, ManualResetEvent va rămâne semnalizat, iar ManualResetEvent poate trezi mai multe fire simultan pentru a continua execuția.




Precedent:Instrumentul de analizare a fișierelor .har și HARViewer
Următor:Implementarea blocării distribuite Zookeeper
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com