Trådrelaterte konsepter 1. Trådsynkronisering ManualResetEvent Set()-metoden setter tilstanden til Signaled Reset() for å sette den til null signal WaitOne() vil blokkere til den har et signal, og hvis det er et signal på tidspunktet for å ringe WaitOne, vil den ikke blokkere AutoResetEvent Forskjellen fra ManualResetEvent er at AutoResetEvent.WaitOne() automatisk endrer tilstanden til hendelsesobjektet, det vil si at tilstanden til hendelsen endres hver gang AutoResetEvent.WaitOne() kjøres. Signal – > ingen signal; Ingen signal – > har et signal
example:
myResetEven.Set(), som faktisk er ekvivalent med en switch, hvis set()-metoden ikke kjøres, vil ikke følgende waitOne() kunne vente på varslingen for å la den kjøre, slik at setningen etter waitOne ikke blir utført. Monitormetode Wait() Pulse()-mekanismen brukes for intertrådinteraksjon; når et objekt sender ut Monitor.Wait(), vil tråden som får tilgang til objektet forbli i ventetilstanden. Inntil den får et oppvåkningssignal. Monitor.Pulse() brukes til å sende signaler til den ventende tråden. Det vil si, i det kritiske området mellom Monitor.Enter() og Monitor.Exit(), for å frigjøre låsen på objektet og blokkere den nåværende tråden, er det i ventetilstand i køen.
Lock er annerledes enn Mutex Låsesynkronisering mellom flere tråder Synkronisering av flere tråder mellom Mutex-prosesser, eller synkronisering av flere prosesser I .Net-multitrådet programmering brukes ofte AutoResetEvent- og ManualResetEvent-klassene, og bruken deres er svært lik, men det finnes forskjeller. Set-metoden setter signalet til send-tilstand, Reset-metoden setter signalet til ikke-send-tilstand, og WaitOne venter på at signalet skal bli sendt. Den opprinnelige tilstanden til konstruktøren kan bestemmes av parameterverdien; hvis den er sann, blokkerer den ikke, og falsk er blokkeringstilstanden. Hvis en tråd kaller WaitOne-metoden, mottar tråden signalet når den er i send-tilstanden og fortsetter å kjøre nedover. Forskjellen er at etter kallet tillater AutoResetEvent.WaitOne() bare én tråd å komme inn om gangen, og når en tråd får et signal, vil AutoResetEvent automatisk sette signalet til ingen send-tilstand, og de andre trådene som kaller WaitOne kan bare fortsette å vente. Det vil si at AutoResetEvent bare vekker én tråd om gangen; ManualResetEvent kan vekke flere tråder, fordi når én tråd kaller ManualResetEvent.Set()-metoden, får de andre trådene som kaller WaitOne signalet for å fortsette utførelsen, og ManualResetEvent setter ikke automatisk signalet til ikke å sende. Med andre ord, med mindre ManualResetEvent.Reset()-metoden kalles manuelt, vil ManualResetEvent forbli signalisert, og ManualResetEvent kan vekke flere tråder samtidig for å fortsette kjøringen. |