Поделиться через


AutoResetEvent Класс

Определение

Представляет событие синхронизации потоков, которое при сигнале освобождает один поток ожидания и автоматически сбрасывает его. Этот класс не может быть унаследован.

public ref class AutoResetEvent sealed : System::Threading::EventWaitHandle
public ref class AutoResetEvent sealed : System::Threading::WaitHandle
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
public sealed class AutoResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
type AutoResetEvent = class
    inherit EventWaitHandle
type AutoResetEvent = class
    inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type AutoResetEvent = class
    inherit EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits WaitHandle
Наследование
Наследование
Наследование
Атрибуты

Примеры

В следующем примере показано, как использовать AutoResetEvent для выпуска одного потока за раз, вызывая метод Set (в базовом классе) каждый раз, когда пользователь нажимает клавишу ВВОД. В примере запускаются три потока, ожидающие AutoResetEvent, созданной в сигнальном состоянии. Первый поток освобождается немедленно, так как AutoResetEvent уже находится в сигнальном состоянии. При этом AutoResetEvent сбрасывается в состояние без сигнала, чтобы последующие потоки блокировались. Заблокированные потоки не выпускаются, пока пользователь не освобождает их по одному за раз, нажав клавишу ВВОД ВВОД.

После освобождения потоков из первого AutoResetEventони ожидают другого AutoResetEvent, который был создан в состоянии без сигнала. Все три потока блокируются, поэтому метод Set должен вызываться три раза, чтобы освободить их все.

using namespace System;
using namespace System::Threading;

ref class Example
{
private:
    static AutoResetEvent^ event_1 = gcnew AutoResetEvent(true);
    static AutoResetEvent^ event_2 = gcnew AutoResetEvent(false);

    static void ThreadProc()
    {
        String^ name = Thread::CurrentThread->Name;

        Console::WriteLine("{0} waits on AutoResetEvent #1.", name);
        event_1->WaitOne();
        Console::WriteLine("{0} is released from AutoResetEvent #1.", name);

        Console::WriteLine("{0} waits on AutoResetEvent #2.", name);
        event_2->WaitOne();
        Console::WriteLine("{0} is released from AutoResetEvent #2.", name);

        Console::WriteLine("{0} ends.", name);
    }

public:
    static void Demo()
    {
        Console::WriteLine("Press Enter to create three threads and start them.\r\n" +
                           "The threads wait on AutoResetEvent #1, which was created\r\n" +
                           "in the signaled state, so the first thread is released.\r\n" +
                           "This puts AutoResetEvent #1 into the unsignaled state.");
        Console::ReadLine();
            
        for (int i = 1; i < 4; i++)
        {
            Thread^ t = gcnew Thread(gcnew ThreadStart(&ThreadProc));
            t->Name = "Thread_" + i;
            t->Start();
        }
        Thread::Sleep(250);

        for (int i = 0; i < 2; i++)
        {
            Console::WriteLine("Press Enter to release another thread.");
            Console::ReadLine();
            event_1->Set();
            Thread::Sleep(250);
        }

        Console::WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
        for (int i = 0; i < 3; i++)
        {
            Console::WriteLine("Press Enter to release a thread.");
            Console::ReadLine();
            event_2->Set();
            Thread::Sleep(250);
        }

        // Visual Studio: Uncomment the following line.
        //Console::Readline();
    }
};

void main()
{
    Example::Demo();
}

/* This example produces output similar to the following:

Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.

Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.

Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.

Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.

All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.

Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.

Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.

Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
 */
using System;
using System.Threading;

// Visual Studio: Replace the default class in a Console project with 
//                the following class.
class Example
{
    private static AutoResetEvent event_1 = new AutoResetEvent(true);
    private static AutoResetEvent event_2 = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Press Enter to create three threads and start them.\r\n" +
                          "The threads wait on AutoResetEvent #1, which was created\r\n" +
                          "in the signaled state, so the first thread is released.\r\n" +
                          "This puts AutoResetEvent #1 into the unsignaled state.");
        Console.ReadLine();
            
        for (int i = 1; i < 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }
        Thread.Sleep(250);

        for (int i = 0; i < 2; i++)
        {
            Console.WriteLine("Press Enter to release another thread.");
            Console.ReadLine();
            event_1.Set();
            Thread.Sleep(250);
        }

        Console.WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine("Press Enter to release a thread.");
            Console.ReadLine();
            event_2.Set();
            Thread.Sleep(250);
        }

        // Visual Studio: Uncomment the following line.
        //Console.Readline();
    }

    static void ThreadProc()
    {
        string name = Thread.CurrentThread.Name;

        Console.WriteLine("{0} waits on AutoResetEvent #1.", name);
        event_1.WaitOne();
        Console.WriteLine("{0} is released from AutoResetEvent #1.", name);

        Console.WriteLine("{0} waits on AutoResetEvent #2.", name);
        event_2.WaitOne();
        Console.WriteLine("{0} is released from AutoResetEvent #2.", name);

        Console.WriteLine("{0} ends.", name);
    }
}

/* This example produces output similar to the following:

Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.

Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.

Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.

Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.

All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.

Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.

Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.

Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
 */
Imports System.Threading

' Visual Studio: Replace the default class in a Console project with 
'                the following class.
Class Example

    Private Shared event_1 As New AutoResetEvent(True)
    Private Shared event_2 As New AutoResetEvent(False)

    <MTAThread()> _
    Shared Sub Main()
    
        Console.WriteLine("Press Enter to create three threads and start them." & vbCrLf & _
                          "The threads wait on AutoResetEvent #1, which was created" & vbCrLf & _
                          "in the signaled state, so the first thread is released." & vbCrLf & _
                          "This puts AutoResetEvent #1 into the unsignaled state.")
        Console.ReadLine()
            
        For i As Integer = 1 To 3
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next
        Thread.Sleep(250)

        For i As Integer = 1 To 2
            Console.WriteLine("Press Enter to release another thread.")
            Console.ReadLine()

            event_1.Set()
            Thread.Sleep(250)
        Next

        Console.WriteLine(vbCrLf & "All threads are now waiting on AutoResetEvent #2.")
        For i As Integer = 1 To 3
            Console.WriteLine("Press Enter to release a thread.")
            Console.ReadLine()

            event_2.Set()
            Thread.Sleep(250)
        Next

        ' Visual Studio: Uncomment the following line.
        'Console.Readline()
    End Sub

    Shared Sub ThreadProc()
    
        Dim name As String = Thread.CurrentThread.Name

        Console.WriteLine("{0} waits on AutoResetEvent #1.", name)
        event_1.WaitOne()
        Console.WriteLine("{0} is released from AutoResetEvent #1.", name)

        Console.WriteLine("{0} waits on AutoResetEvent #2.", name)
        event_2.WaitOne()
        Console.WriteLine("{0} is released from AutoResetEvent #2.", name)

        Console.WriteLine("{0} ends.", name)
    End Sub
End Class

' This example produces output similar to the following:
'
'Press Enter to create three threads and start them.
'The threads wait on AutoResetEvent #1, which was created
'in the signaled state, so the first thread is released.
'This puts AutoResetEvent #1 into the unsignaled state.
'
'Thread_1 waits on AutoResetEvent #1.
'Thread_1 is released from AutoResetEvent #1.
'Thread_1 waits on AutoResetEvent #2.
'Thread_3 waits on AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #1.
'Press Enter to release another thread.
'
'Thread_3 is released from AutoResetEvent #1.
'Thread_3 waits on AutoResetEvent #2.
'Press Enter to release another thread.
'
'Thread_2 is released from AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #2.
'
'All threads are now waiting on AutoResetEvent #2.
'Press Enter to release a thread.
'
'Thread_2 is released from AutoResetEvent #2.
'Thread_2 ends.
'Press Enter to release a thread.
'
'Thread_1 is released from AutoResetEvent #2.
'Thread_1 ends.
'Press Enter to release a thread.
'
'Thread_3 is released from AutoResetEvent #2.
'Thread_3 ends.

Комментарии

Вы используете AutoResetEvent, ManualResetEventи EventWaitHandle для взаимодействия с потоком (или сигнала потока). Дополнительные сведения см. в разделе взаимодействие с потоком.

Поток ожидает сигнала, вызвав AutoResetEvent.WaitOne. Если AutoResetEvent находится в состоянии без сигнала, поток блокируется до вызова AutoResetEvent.Set. Вызов Set сигналов AutoResetEvent, чтобы освободить поток ожидания. AutoResetEvent остается сигналом до тех пор, пока Reset не будет вызван или выпущен один поток ожидания, в то время как он автоматически возвращается в состояние без сигнала.

Если потоки не ожидают, когда AutoResetEvent переходит в сигнальное состояние, состояние остается сигналом до тех пор, пока поток не увидит сигнал (вызывая WaitOne). Этот поток не блокируется: AutoResetEvent немедленно освобождает поток и возвращается в состояние, отличное от сигнала.

Важный

Нет никакой гарантии, что каждый вызов метода Set будет выпускать поток. Если два вызова слишком близко друг к другу, поэтому второй вызов возникает перед выпуском потока, освобождается только один поток. Это как будто второй звонок не произошел. Кроме того, если Set вызывается, когда нет потоков ожидания и AutoResetEvent уже сигнализирует, вызов не действует.

Вы можете управлять начальным состоянием AutoResetEvent, передав логическое значение конструктору: true, если начальное состояние сигнализируется и false в противном случае.

AutoResetEvent также можно использовать с методами staticWaitAll и WaitAny.

AutoResetEvent является производным от класса EventWaitHandle. AutoResetEvent функционально эквивалентен EventWaitHandle, созданной с помощью EventResetMode.AutoReset.

Заметка

В отличие от класса AutoResetEvent, класс EventWaitHandle предоставляет доступ к именованным событиям синхронизации системы.

Важный

Этот тип реализует интерфейс IDisposable. Завершив использование типа, его следует удалить напрямую или косвенно. Чтобы удалить тип напрямую, вызовите метод Dispose в блоке try/catch. Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" на странице интерфейса IDisposable.

Конструкторы

AutoResetEvent(Boolean)

Инициализирует новый экземпляр класса AutoResetEvent с логическим значением, указывающим, следует ли задать начальное состояние для сигнала.

Поля

WaitTimeout

Указывает, что время ожидания операции WaitAny(WaitHandle[], Int32, Boolean) истекло до сигнала любого дескриптора ожидания. Это поле является константой.

(Унаследовано от WaitHandle)

Свойства

Handle
Устаревшие..
Устаревшие..

Возвращает или задает дескриптор собственной операционной системы.

(Унаследовано от WaitHandle)
SafeWaitHandle

Возвращает или задает дескриптор собственной операционной системы.

(Унаследовано от WaitHandle)

Методы

Close()

Освобождает все ресурсы, удерживаемые текущим WaitHandle.

(Унаследовано от WaitHandle)
CreateObjRef(Type)

Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса WaitHandle.

(Унаследовано от WaitHandle)
Dispose(Boolean)

При переопределении в производном классе освобождает неуправляемые ресурсы, используемые WaitHandle, и при необходимости освобождает управляемые ресурсы.

(Унаследовано от WaitHandle)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetAccessControl()

Возвращает объект EventWaitHandleSecurity, представляющий безопасность управления доступом для именованного системного события, представленного текущим объектом EventWaitHandle.

(Унаследовано от EventWaitHandle)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()
Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неглубокую копию текущего объекта MarshalByRefObject.

(Унаследовано от MarshalByRefObject)
Reset()

Задает состояние события незначаемой, что приводит к блокировке потоков.

Reset()

Задает состояние события незначаемой, что приводит к блокировке потоков.

(Унаследовано от EventWaitHandle)
Set()

Задает состояние сигнального события, что позволяет продолжить по крайней мере один поток ожидания.

Set()

Задает состояние сигнала события, что позволяет продолжить один или несколько потоков ожидания.

(Унаследовано от EventWaitHandle)
SetAccessControl(EventWaitHandleSecurity)

Задает безопасность управления доступом для именованного системного события.

(Унаследовано от EventWaitHandle)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
WaitOne()

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал.

(Унаследовано от WaitHandle)
WaitOne(Int32)

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени в миллисекундах.

(Унаследовано от WaitHandle)
WaitOne(Int32, Boolean)

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием.

(Унаследовано от WaitHandle)
WaitOne(TimeSpan)

Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan для указания интервала времени.

(Унаследовано от WaitHandle)
WaitOne(TimeSpan, Boolean)

Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием.

(Унаследовано от WaitHandle)

Явные реализации интерфейса

IDisposable.Dispose()

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.

Освобождает все ресурсы, используемые WaitHandle.

(Унаследовано от WaitHandle)

Методы расширения

GetAccessControl(EventWaitHandle)

Возвращает дескрипторы безопасности для указанного handle.

SetAccessControl(EventWaitHandle, EventWaitHandleSecurity)

Задает дескрипторы безопасности для указанного дескриптора ожидания события.

GetSafeWaitHandle(WaitHandle)

Возвращает безопасный дескриптор для собственного дескриптора ожидания операционной системы.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Задает безопасный дескриптор для собственного дескриптора ожидания операционной системы.

Применяется к

Потокобезопасность

Этот класс является потокобезопасной.

См. также раздел