Концепции, свързани с нишки 1. Синхронизация на нишки ManualResetEvent Методът Set() задава състоянието на Signaled Reset(), за да го настроя на no signal WaitOne() ще блокира, докато не получи сигнал, и ако има сигнал в момента на повикване към WaitOne, няма да блокира AutoResetEvent Разликата от ManualResetEvent е, че AutoResetEvent.WaitOne() автоматично променя състоянието на обекта събитие, тоест състоянието на събитието се променя всеки път, когато се изпълни AutoResetEvent.WaitOne(). Сигнал - > няма сигнал; Няма сигнал – > има сигнал
example:
myResetEven.Set(), което всъщност е еквивалентно на switch, ако методът set() не бъде изпълнен, следващият waitOne() няма да може да изчака известието, за да го изпълни, така че операторът след waitOne няма да бъде изпълнен. Метод на мониторинг Механизмът Wait() Pulse() се използва за междунишково взаимодействие, когато обектът излъчва Monitor.Wait(), нишката, която достъпва обекта, остава в състояние на изчакване. докато не получи сигнал за събуждане. Monitor.Pulse() се използва за изпращане на сигнали към чакащата нишка. Тоест, в критичната зона между Monitor.Enter() и Monitor.Exit(), за да се освободи заключването на обекта и да се блокира текущата нишка, той е в чакащо състояние в опашката.
Lock е различен от Mutex Синхронизация на заключване между множество нишки Синхронизация на множество нишки между Mutex процеси или синхронизация на множество процеси В .Net мултипоточното програмиране често се използват класовете AutoResetEvent и ManualResetEvent, като употребата им е много сходна, но има разлики. Методът Set поставя сигнала в състояние на изпращане, методът Reset поставя сигнала в състояние без изпращане, а WaitOne чака сигналът да бъде изпратен. Началното състояние на конструктора може да се определи от стойността на параметъра, ако е вярно, то не блокира, а false е блокиращото състояние. Ако нишката извика метода WaitOne, тя получава сигнала, когато е в състояние на изпращане, и продължава да изпълнява надолу. Разликата е, че след обаждането AutoResetEvent.WaitOne() позволява влизане само на една нишка наведнъж, а когато нишка получи сигнал, AutoResetEvent автоматично поставя сигнала в състояние без изпращане, а другите нишки, които викат WaitOne, могат само да продължат да чакат. Тоест, AutoResetEvent събужда само една нишка наведнъж; ManualResetEvent може да събуди няколко нишки, защото когато една нишка извика метода ManualResetEvent.Set(), другите нишки, които извикват WaitOne, получават сигнал за продължаване на изпълнението, а ManualResetEvent не задава автоматично сигнала да не изпраща. С други думи, освен ако методът ManualResetEvent.Reset() не се извика ръчно, ManualResetEvent ще остане сигнализиран и може да събуди няколко нишки едновременно, за да продължи изпълнението. |