AutoResetEvent поддерживает логическую переменную в памяти. Если логическая переменная имеет значение false, она блокирует поток, а если логическая переменная имеет значение true, разблокирует поток.
Когда мы создаем экземпляр объекта AutoResetEvent, мы передаем значение по умолчанию логического значения в конструкторе. Ниже приведен синтаксис создания экземпляра объекта AutoResetEvent.
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
Метод WaitOne
Этот метод блокирует текущий поток и ожидает сигнала от другого потока. Метод WaitOne переводит текущий поток в состояние потока Sleep. Метод WaitOne возвращает true, если он получает сигнал, иначе возвращает false.
autoResetEvent.WaitOne();
Вторая перегрузка метода WaitOne ожидает указанное количество секунд. Если он не получает сигнал, поток продолжает свою работу.
static void ThreadMethod()
{
while(!autoResetEvent.WaitOne(TimeSpan.FromSeconds(2)))
{
Console.WriteLine("Continue");
Thread.Sleep(TimeSpan.FromSeconds(1));
}
Console.WriteLine("Thread got signal");
}
Мы вызвали метод WaitOne, передав 2 секунды в качестве аргументов. В цикле while он ожидает сигнала в течение 2 секунд, затем продолжает работу. Когда поток получил сигнал, WaitOne возвращает значение true, выходит из цикла и печатает «Поток получил сигнал».
Метод набора
Метод AutoResetEvent Set отправил сигнал ожидающему потоку для продолжения его работы. Ниже приведен синтаксис вызова метода Set.
autoResetEvent.Set();
ManualResetEvent поддерживает логическую переменную в памяти. Когда логическая переменная имеет значение false, она блокирует все потоки, а когда логическая переменная имеет значение true, она разблокирует все потоки.
Когда мы создаем экземпляр ManualResetEvent, мы инициализируем его с логическим значением по умолчанию.
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
В приведенном выше коде мы инициализируем ManualResetEvent со значением false, что означает, что все потоки, которые вызывают метод WaitOne, будут блокироваться, пока какой-то поток не вызовет метод Set ().
Если мы инициализируем ManualResetEvent со значением true, все потоки, которые вызывают метод WaitOne, не будут блокироваться и будут свободны для продолжения.
Метод WaitOne
Этот метод блокирует текущий поток и ожидает сигнала от другого потока. Возвращает true, если получает сигнал, иначе возвращает false.
Ниже приведен синтаксис вызова метода WaitOne.
manualResetEvent.WaitOne();
Во второй перегрузке метода WaitOne мы можем указать интервал времени, в течение которого текущий поток будет ожидать сигнала. Если во внутреннем времени он не получает сигнал, он возвращает false и переходит на следующую строку метода.
Ниже приведен синтаксис вызова метода WaitOne с интервалом времени.
bool isSignalled = manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));
Мы должны указать 5 секунд в методе WaitOne. Если объект manualResetEvent не получает сигнал в течение 5 секунд, для переменной isSignalled устанавливается значение false.
Установить метод
Этот метод используется для отправки сигнала всем ожидающим потокам. Метод Set () устанавливает для логической переменной объекта ManualResetEvent значение true. Все ожидающие потоки разблокированы и продолжаются.
Ниже приведен синтаксис вызова метода Set ().
manualResetEvent.Set();
Метод сброса
Как только мы вызываем метод Set () для объекта ManualResetEvent, его логическое значение остается истинным. Для сброса значения мы можем использовать метод Reset (). Метод сброса изменяет логическое значение на false.
Ниже приведен синтаксис вызова метода Reset.
manualResetEvent.Reset();
Мы должны немедленно вызвать метод Reset после вызова метода Set, если мы хотим отправить сигнал потокам несколько раз.