EventWaitHandle Класс

Определение

Представляет событие синхронизации потоков.

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

Примеры

В следующем примере кода используется перегрузка SignalAndWait(WaitHandle, WaitHandle) метода, позволяющая основному потоку сигнализировать заблокированный поток, а затем ждать завершения задачи.

Пример запускает пять потоков и позволяет блокировать созданные EventWaitHandle с EventResetMode.AutoReset флагом потоки, а затем освобождает один поток каждый раз, когда пользователь нажимает клавишу ВВОД . Затем пример помещает еще пять потоков и освобождает их с помощью созданного EventWaitHandle флага EventResetMode.ManualReset .

using System;
using System.Threading;

public class Example
{
    // The EventWaitHandle used to demonstrate the difference
    // between AutoReset and ManualReset synchronization events.
    //
    private static EventWaitHandle ewh;

    // A counter to make sure all threads are started and
    // blocked before any are released. A Long is used to show
    // the use of the 64-bit Interlocked methods.
    //
    private static long threadCount = 0;

    // An AutoReset event that allows the main thread to block
    // until an exiting thread has decremented the count.
    //
    private static EventWaitHandle clearCount = 
        new EventWaitHandle(false, EventResetMode.AutoReset);

    [MTAThread]
    public static void Main()
    {
        // Create an AutoReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

        // Create and start five numbered threads. Use the
        // ParameterizedThreadStart delegate, so the thread
        // number can be passed as an argument to the Start 
        // method.
        for (int i = 0; i <= 4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        // When multiple threads use a 64-bit value on a 32-bit
        // system, you must access the value through the
        // Interlocked class to guarantee thread safety.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Release one thread each time the user presses ENTER,
        // until all threads have been released.
        //
        while (Interlocked.Read(ref threadCount) > 0)
        {
            Console.WriteLine("Press ENTER to release a waiting thread.");
            Console.ReadLine();

            // SignalAndWait signals the EventWaitHandle, which
            // releases exactly one thread before resetting, 
            // because it was created with AutoReset mode. 
            // SignalAndWait then blocks on clearCount, to 
            // allow the signaled thread to decrement the count
            // before looping again.
            //
            WaitHandle.SignalAndWait(ewh, clearCount);
        }
        Console.WriteLine();

        // Create a ManualReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

        // Create and start five more numbered threads.
        //
        for(int i=0; i<=4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Because the EventWaitHandle was created with
        // ManualReset mode, signaling it releases all the
        // waiting threads.
        //
        Console.WriteLine("Press ENTER to release the waiting threads.");
        Console.ReadLine();
        ewh.Set();
    }

    public static void ThreadProc(object data)
    {
        int index = (int) data;

        Console.WriteLine("Thread {0} blocks.", data);
        // Increment the count of blocked threads.
        Interlocked.Increment(ref threadCount);

        // Wait on the EventWaitHandle.
        ewh.WaitOne();

        Console.WriteLine("Thread {0} exits.", data);
        // Decrement the count of blocked threads.
        Interlocked.Decrement(ref threadCount);

        // After signaling ewh, the main thread blocks on
        // clearCount until the signaled thread has 
        // decremented the count. Signal it now.
        //
        clearCount.Set();
    }
}
Imports System.Threading

Public Class Example

    ' The EventWaitHandle used to demonstrate the difference
    ' between AutoReset and ManualReset synchronization events.
    '
    Private Shared ewh As EventWaitHandle

    ' A counter to make sure all threads are started and
    ' blocked before any are released. A Long is used to show
    ' the use of the 64-bit Interlocked methods.
    '
    Private Shared threadCount As Long = 0

    ' An AutoReset event that allows the main thread to block
    ' until an exiting thread has decremented the count.
    '
    Private Shared clearCount As New EventWaitHandle(False, _
        EventResetMode.AutoReset)

    <MTAThread> _
    Public Shared Sub Main()

        ' Create an AutoReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.AutoReset)

        ' Create and start five numbered threads. Use the
        ' ParameterizedThreadStart delegate, so the thread
        ' number can be passed as an argument to the Start 
        ' method.
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        ' When multiple threads use a 64-bit value on a 32-bit
        ' system, you must access the value through the
        ' Interlocked class to guarantee thread safety.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Release one thread each time the user presses ENTER,
        ' until all threads have been released.
        '
        While Interlocked.Read(threadCount) > 0
            Console.WriteLine("Press ENTER to release a waiting thread.")
            Console.ReadLine()

            ' SignalAndWait signals the EventWaitHandle, which
            ' releases exactly one thread before resetting, 
            ' because it was created with AutoReset mode. 
            ' SignalAndWait then blocks on clearCount, to 
            ' allow the signaled thread to decrement the count
            ' before looping again.
            '
            WaitHandle.SignalAndWait(ewh, clearCount)
        End While
        Console.WriteLine()

        ' Create a ManualReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.ManualReset)

        ' Create and start five more numbered threads.
        '
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Because the EventWaitHandle was created with
        ' ManualReset mode, signaling it releases all the
        ' waiting threads.
        '
        Console.WriteLine("Press ENTER to release the waiting threads.")
        Console.ReadLine()
        ewh.Set()
        
    End Sub

    Public Shared Sub ThreadProc(ByVal data As Object)
        Dim index As Integer = CInt(data)

        Console.WriteLine("Thread {0} blocks.", data)
        ' Increment the count of blocked threads.
        Interlocked.Increment(threadCount)

        ' Wait on the EventWaitHandle.
        ewh.WaitOne()

        Console.WriteLine("Thread {0} exits.", data)
        ' Decrement the count of blocked threads.
        Interlocked.Decrement(threadCount)

        ' After signaling ewh, the main thread blocks on
        ' clearCount until the signaled thread has 
        ' decremented the count. Signal it now.
        '
        clearCount.Set()
    End Sub
End Class

Комментарии

Класс EventWaitHandle позволяет потокам взаимодействовать друг с другом, сигналируя. Как правило, один или несколько потоков блокируются в EventWaitHandle блоке, пока не разблокированный поток не вызывает Set метод, освобождая один или несколько блокированных потоков. Поток может сигнализировать EventWaitHandle, а затем блокировать его, вызвав метод static (Shared в Visual Basic) WaitHandle.SignalAndWait.

Note

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

Поведение EventWaitHandle сигнала зависит от режима сброса. Созданный EventWaitHandle с флагом EventResetMode.AutoReset сбрасывается автоматически при сигнале после выпуска одного потока ожидания. Флаг EventWaitHandle, созданный с помощью EventResetMode.ManualReset, остается в состоянии сигнализации до тех пор, пока не будет вызван его метод Reset.

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

События сброса вручную похожи на шлюзы. Если событие не сигнализирует, потоки, ожидающие его, будут блокироваться. При сигнале события все потоки ожидания освобождаются, а событие остается сигналом (т. е. последующие ожидания не блокируются), пока его Reset метод не будет вызван. События сброса вручную полезны, когда один поток должен завершить действие, прежде чем другие потоки смогут продолжить работу.

объекты EventWaitHandle можно использовать с методами static(Shared в Visual Basic) WaitHandle.WaitAll и WaitHandle.WaitAny.

Дополнительные сведения см. в разделе "Взаимодействие с потоком" или в разделе "Обзор примитивов синхронизации ".

Предостережение

По умолчанию именованное событие не ограничивается пользователем, создающим его. Другие пользователи могут открыть и использовать событие, включая вмешательство в событие, задав или сбросив его неправильно. Чтобы ограничить доступ к определенным пользователям, можно использовать перегрузку конструктора или EventWaitHandleAcl передать ее при EventWaitHandleSecurity создании именованного события. Избегайте использования именованных событий без ограничений доступа в системах, которые могут иметь ненадежных пользователей, выполняющих код.

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

Имя Описание
EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity)

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

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

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

EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean)

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

EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions)

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

EventWaitHandle(Boolean, EventResetMode, String)

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

EventWaitHandle(Boolean, EventResetMode)

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

Поля

Имя Описание
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 объектом.

GetHashCode()

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

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

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

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

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

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

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

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

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

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

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

(Унаследовано от MarshalByRefObject)
OpenExisting(String, EventWaitHandleRights)

Открывает указанное именованное событие синхронизации, если оно уже существует, с требуемым доступом к безопасности.

OpenExisting(String, NamedWaitHandleOptions)

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

OpenExisting(String)

Открывает указанное именованное событие синхронизации, если оно уже существует.

Reset()

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

Set()

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

SetAccessControl(EventWaitHandleSecurity)

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

ToString()

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

(Унаследовано от Object)
TryOpenExisting(String, EventWaitHandle)

Открывает указанное именованное событие синхронизации, если оно уже существует, и возвращает значение, указывающее, выполнена ли операция успешно.

TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle)

Открывает указанное именованное событие синхронизации, если оно уже существует, при требуемом доступе к безопасности и возвращает значение, указывающее, выполнена ли операция успешно.

TryOpenExisting(String, NamedWaitHandleOptions, EventWaitHandle)

Открывает указанное именованное событие синхронизации, если оно уже существует, и возвращает значение, указывающее, выполнена ли операция успешно. Если параметры заданы только для текущего пользователя, элементы управления доступом объекта проверяются для вызывающего пользователя.

WaitOne()

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

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

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

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

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

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

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

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

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

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

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

Имя Описание
IDisposable.Dispose()

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

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

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

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

Имя Описание
GetAccessControl(EventWaitHandle)

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

GetSafeWaitHandle(WaitHandle)

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

SetAccessControl(EventWaitHandle, EventWaitHandleSecurity)

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

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

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

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

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

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

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