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

Определение

Инициализирует новый экземпляр класса EventWaitHandle.Initializes a new instance of the EventWaitHandle class.

Перегрузки

EventWaitHandle(Boolean, EventResetMode)

Выполняет инициализацию нового экземпляра класса EventWaitHandle, определяя, получает ли сигнал, ожидающий дескриптор, и производится ли сброс автоматически или вручную.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled, and whether it resets automatically or manually.

EventWaitHandle(Boolean, EventResetMode, String)

Выполняет инициализацию нового экземпляра класса EventWaitHandle, определяющего получает ли сигнал дескриптор ожидания, если он был создан в результате данного вызова, сбрасывается ли он автоматически или вручную, а также имя системного события синхронизации.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, and the name of a system synchronization event.

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Инициализирует новый экземпляр класса EventWaitHandle и указывает следующие сведения: передавать ли сигнал в дескриптор ожидания при первичном запуске в результате этого вызова; выполнять ли сброс автоматически или вручную; имя системного события синхронизации; логическая переменная для сохранения информации о том, было ли создано именованное системное событие.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, the name of a system synchronization event, and a Boolean variable whose value after the call indicates whether the named system event was created.

EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity)

Инициализирует новый экземпляр класса EventWaitHandle с указанием следующих сведений: передавать ли сигнал в дескриптор ожидания при первичном запуске в результате этого вызова, выполнять ли сброс автоматически или вручную, имя системного события синхронизации, логическая переменная для сохранения информации о том, было ли создано именованное системное событие, правила управления доступом для именованного события, если оно создается.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, the name of a system synchronization event, a Boolean variable whose value after the call indicates whether the named system event was created, and the access control security to be applied to the named event if it is created.

EventWaitHandle(Boolean, EventResetMode)

Выполняет инициализацию нового экземпляра класса EventWaitHandle, определяя, получает ли сигнал, ожидающий дескриптор, и производится ли сброс автоматически или вручную.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled, and whether it resets automatically or manually.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode);
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode)

Параметры

initialState
Boolean

Значение true для задания начального состояния сигнальным; false для задания несигнального начального состояния.true to set the initial state to signaled; false to set it to nonsignaled.

mode
EventResetMode

Одно из значений EventResetMode, которое определяет, выполняется ли сброс события автоматически или вручную.One of the EventResetMode values that determines whether the event resets automatically or manually.

Исключения

Значение перечисления mode вышло за допустимый диапазон.The mode enum value was out of legal range.

Примеры

В следующем примере кода используется SignalAndWait(WaitHandle, WaitHandle) перегрузка метода, позволяющая основному потоку сообщить о заблокированном потоке, а затем подождать, пока поток не завершит задачу.The following code example uses the SignalAndWait(WaitHandle, WaitHandle) method overload to allow the main thread to signal a blocked thread and then wait until the thread finishes a task.

Этот пример запускает пять потоков и позволяет им блокироваться на EventWaitHandle созданном с помощью EventResetMode.AutoReset флага, а затем освобождает один поток каждый раз, когда пользователь нажимает клавишу ВВОД.The example starts five threads and allows them to block on an EventWaitHandle created with the EventResetMode.AutoReset flag, then releases one thread each time the user presses ENTER key. Затем пример помещает в очередь еще пять потоков и освобождает их все с помощью EventWaitHandle параметра, созданного с EventResetMode.ManualReset флагом.The example then queues another five threads and releases them all using an EventWaitHandle created with the EventResetMode.ManualReset flag.

using namespace System;
using namespace System::Threading;

public ref class Example
{
private:
   // The EventWaitHandle used to demonstrate the difference
   // between AutoReset and ManualReset synchronization events.
   //
   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.
   //
   static __int64 threadCount = 0;

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

public:
   [MTAThread]
   static void main()
   {
      // Create an AutoReset EventWaitHandle.
      //
      ewh = gcnew 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 = gcnew Thread(
            gcnew 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( threadCount ) < 5 )
      {
         Thread::Sleep( 500 );
      }

      // Release one thread each time the user presses ENTER,
      // until all threads have been released.
      //
      while ( Interlocked::Read( threadCount ) > 0 )
      {
         Console::WriteLine( L"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 = gcnew EventWaitHandle( false,EventResetMode::ManualReset );
      
      // Create and start five more numbered threads.
      //
      for ( int i = 0; i <= 4; i++ )
      {
         Thread^ t = gcnew Thread(
            gcnew ParameterizedThreadStart( ThreadProc ) );
         t->Start( i );
      }
      
      // Wait until all the threads have started and blocked.
      //
      while ( Interlocked::Read( threadCount ) < 5 )
      {
         Thread::Sleep( 500 );
      }

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

   }

   static void ThreadProc( Object^ data )
   {
      int index = static_cast<Int32>(data);

      Console::WriteLine( L"Thread {0} blocks.", data );
      // Increment the count of blocked threads.
      Interlocked::Increment( threadCount );
      
      // Wait on the EventWaitHandle.
      ewh->WaitOne();

      Console::WriteLine( L"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();
   }
};
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

Комментарии

Если начальное состояние события является несигнальным, потоки, ожидающие события, будут блокироваться.If the initial state of the event is nonsignaled, threads that wait on the event will block. Если исходное состояние сигнальное, а ManualReset флаг задан для mode , потоки, ожидающие события, не будут блокироваться.If the initial state is signaled, and the ManualReset flag is specified for mode, threads that wait on the event will not block. Если начальное состояние сигнальное, а modeAutoReset , то первый поток, ожидающий события, будет немедленно освобожден, после чего событие будет сброшено, а последующие потоки будут блокироваться.If the initial state is signaled, and mode is AutoReset, the first thread that waits on the event will be released immediately, after which the event will reset, and subsequent threads will block.

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

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

EventWaitHandle(Boolean, EventResetMode, String)

Выполняет инициализацию нового экземпляра класса EventWaitHandle, определяющего получает ли сигнал дескриптор ожидания, если он был создан в результате данного вызова, сбрасывается ли он автоматически или вручную, а также имя системного события синхронизации.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, and the name of a system synchronization event.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name);
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name);
[System.Security.SecurityCritical]
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String)

Параметры

initialState
Boolean

Значение true обозначает, что именованное событие получит исходное сигнальное состояние, если такое событие создается в результате этого вызова; значение false устанавливает несигнальное состояние.true to set the initial state to signaled if the named event is created as a result of this call; false to set it to nonsignaled.

mode
EventResetMode

Одно из значений EventResetMode, которое определяет, выполняется ли сброс события автоматически или вручную.One of the EventResetMode values that determines whether the event resets automatically or manually.

name
String

Имя, если объект синхронизации должен использоваться совместно с другими процессами. В противном случае — null или пустая строка.The name, if the synchronization object is to be shared with other processes; otherwise, null or an empty string. Имя указано с учетом регистра.The name is case-sensitive.

Атрибуты

Исключения

name недопустим.name is invalid. Это исключение может возникнуть по разным причинам, включая некоторые ограничения, установленные операционной системой (например, в отношении использования неизвестных префиксов или недопустимых символов).This can be for various reasons, including some restrictions that may be placed by the operating system, such as an unknown prefix or invalid characters. Обратите внимание, что в имени и в стандартных префиксах "Global" и "Local" учитывается регистр.Note that the name and common prefixes "Global" and "Local" are case-sensitive.

- или --or-

Возникла другая ошибка.There was some other error. Дополнительные сведения можно получить с помощью свойства HResult.The HResult property may provide more information.

Только в Windows. Для name указано неизвестное пространство имен.Windows only: name specified an unknown namespace. Дополнительные сведения см. в статье Имена объектов.See Object Names for more information.

Слишком длинное значение name.The name is too long. Ограничения длины могут зависеть от операционной системы или конфигурации.Length restrictions may depend on the operating system or configuration.

Именованное событие уже существует и имеет настройки управления доступом, но пользователь не имеет прав FullControl.The named event exists and has access control security, but the user does not have FullControl.

Не удается создать объект синхронизации с указанным значением для параметра name.A synchronization object with the provided name cannot be created. Возможно, другой объект синхронизации имеет такое же имя.A synchronization object of a different type might have the same name.

Значение перечисления mode вышло за допустимый диапазон.The mode enum value was out of legal range.

- или --or-

Только в .NET Framework. name превышает значение MAX_PATH (260 символов)..NET Framework only: name is longer than MAX_PATH (260 characters).

Комментарии

name Global\ Local\ Для можно указать пространство имен с префиксом или.The name may be prefixed with Global\ or Local\ to specify a namespace. Если Global указано пространство имен, объект синхронизации может быть общим для любых процессов в системе.When the Global namespace is specified, the synchronization object may be shared with any processes on the system. Если Local задано пространство имен, которое также используется по умолчанию, если пространство имен не указано, то объект синхронизации может совместно использоваться процессами в одном сеансе.When the Local namespace is specified, which is also the default when no namespace is specified, the synchronization object may be shared with processes in the same session. В Windows сеансом является сеанс входа в систему, и службы обычно выполняются в другом неинтерактивном сеансе.On Windows, a session is a login session, and services typically run in a different non-interactive session. В операционных системах, аналогичных UNIX, каждая оболочка имеет собственный сеанс.On Unix-like operating systems, each shell has its own session. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением "родители-потомки", где все они выполняются в одном сеансе.Session-local synchronization objects may be appropriate for synchronizing between processes with a parent/child relationship where they all run in the same session. Дополнительные сведения об именах объектов синчорнизатион в Windows см. в разделе имена объектов.For more information about synchornization object names on Windows, see Object Names.

Если name предоставляется и объект синхронизации запрошенного типа уже существует в пространстве имен, то открывается существующий объект синхронизации.If a name is provided and a synchronization object of the requested type already exists in the namespace, the existing synchronization object is opened. Если объект синхронизации другого типа уже существует в пространстве имен, создается WaitHandleCannotBeOpenedException исключение.If a synchronization object of a different type already exists in the namespace, a WaitHandleCannotBeOpenedException is thrown. В противном случае создается новый объект синхронизации.Otherwise, a new synchronization object is created.

Если системное событие с именем, указанным для name параметра, уже существует, initialState параметр игнорируется.If a system event with the name specified for the name parameter already exists, the initialState parameter is ignored.

Важно!

При использовании этого конструктора для именованных системных событий укажите false для initialState .When using this constructor for named system events, specify false for initialState. Этот конструктор не дает возможности определить, было ли создано именованное системное событие, поэтому вы не можете делать никаких предположений о состоянии именованного события.This constructor provides no way to determine whether a named system event was created, so you cannot make any assumptions about the state of the named event. Чтобы определить, было ли именованное событие создано, используйте EventWaitHandle(Boolean, EventResetMode, String, Boolean) конструктор или EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) конструктор.To determine whether a named event was created, use the EventWaitHandle(Boolean, EventResetMode, String, Boolean) constructor or the EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) constructor.

Если начальное состояние события является несигнальным, потоки, ожидающие события, будут блокироваться.If the initial state of the event is nonsignaled, threads that wait on the event will block. Если исходное состояние сигнальное, а ManualReset флаг задан для mode , потоки, ожидающие события, не будут блокироваться.If the initial state is signaled, and the ManualReset flag is specified for mode, threads that wait on the event will not block. Если начальное состояние сигнальное, а modeAutoReset , то первый поток, ожидающий события, будет немедленно освобожден, после чего событие будет сброшено, а последующие потоки будут блокироваться.If the initial state is signaled, and mode is AutoReset, the first thread that waits on the event will be released immediately, after which the event will reset, and subsequent threads will block.

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

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

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Инициализирует новый экземпляр класса EventWaitHandle и указывает следующие сведения: передавать ли сигнал в дескриптор ожидания при первичном запуске в результате этого вызова; выполнять ли сброс автоматически или вручную; имя системного события синхронизации; логическая переменная для сохранения информации о том, было ли создано именованное системное событие.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, the name of a system synchronization event, and a Boolean variable whose value after the call indicates whether the named system event was created.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew);
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
[System.Security.SecurityCritical]
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool -> System.Threading.EventWaitHandle
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean)

Параметры

initialState
Boolean

Значение true обозначает, что именованное событие получит исходное сигнальное состояние, если такое событие создается в результате этого вызова; значение false устанавливает несигнальное состояние.true to set the initial state to signaled if the named event is created as a result of this call; false to set it to nonsignaled.

mode
EventResetMode

Одно из значений EventResetMode, которое определяет, выполняется ли сброс события автоматически или вручную.One of the EventResetMode values that determines whether the event resets automatically or manually.

name
String

Имя, если объект синхронизации должен использоваться совместно с другими процессами. В противном случае — null или пустая строка.The name, if the synchronization object is to be shared with other processes; otherwise, null or an empty string. Имя указано с учетом регистра.The name is case-sensitive.

createdNew
Boolean

Когда данный метод возвращает значение, он содержит true, если было создано локальное событие (то есть, если name имеет значение null или пустую строку) или было создано системное событие с заданным именем; либо значение false, если указанное именованное событие уже существовало.When this method returns, contains true if a local event was created (that is, if name is null or an empty string) or if the specified named system event was created; false if the specified named system event already existed. Этот параметр передается неинициализированным.This parameter is passed uninitialized.

Атрибуты

Исключения

name недопустим.name is invalid. Это исключение может возникнуть по разным причинам, включая некоторые ограничения, установленные операционной системой (например, в отношении использования неизвестных префиксов или недопустимых символов).This can be for various reasons, including some restrictions that may be placed by the operating system, such as an unknown prefix or invalid characters. Обратите внимание, что в имени и в стандартных префиксах "Global" и "Local" учитывается регистр.Note that the name and common prefixes "Global" and "Local" are case-sensitive.

- или --or-

Возникла другая ошибка.There was some other error. Дополнительные сведения можно получить с помощью свойства HResult.The HResult property may provide more information.

Только в Windows. Для name указано неизвестное пространство имен.Windows only: name specified an unknown namespace. Дополнительные сведения см. в статье Имена объектов.See Object Names for more information.

Слишком длинное значение name.The name is too long. Ограничения длины могут зависеть от операционной системы или конфигурации.Length restrictions may depend on the operating system or configuration.

Именованное событие уже существует и имеет настройки управления доступом, но пользователь не имеет прав FullControl.The named event exists and has access control security, but the user does not have FullControl.

Не удается создать объект синхронизации с указанным значением для параметра name.A synchronization object with the provided name cannot be created. Возможно, другой объект синхронизации имеет такое же имя.A synchronization object of a different type might have the same name.

Значение перечисления mode вышло за допустимый диапазон.The mode enum value was out of legal range.

- или --or-

Только в .NET Framework. name превышает значение MAX_PATH (260 символов)..NET Framework only: name is longer than MAX_PATH (260 characters).

Комментарии

name Global\ Local\ Для можно указать пространство имен с префиксом или.The name may be prefixed with Global\ or Local\ to specify a namespace. Если Global указано пространство имен, объект синхронизации может быть общим для любых процессов в системе.When the Global namespace is specified, the synchronization object may be shared with any processes on the system. Если Local задано пространство имен, которое также используется по умолчанию, если пространство имен не указано, то объект синхронизации может совместно использоваться процессами в одном сеансе.When the Local namespace is specified, which is also the default when no namespace is specified, the synchronization object may be shared with processes in the same session. В Windows сеансом является сеанс входа в систему, и службы обычно выполняются в другом неинтерактивном сеансе.On Windows, a session is a login session, and services typically run in a different non-interactive session. В операционных системах, аналогичных UNIX, каждая оболочка имеет собственный сеанс.On Unix-like operating systems, each shell has its own session. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением "родители-потомки", где все они выполняются в одном сеансе.Session-local synchronization objects may be appropriate for synchronizing between processes with a parent/child relationship where they all run in the same session. Дополнительные сведения об именах объектов синчорнизатион в Windows см. в разделе имена объектов.For more information about synchornization object names on Windows, see Object Names.

Если name предоставляется и объект синхронизации запрошенного типа уже существует в пространстве имен, то открывается существующий объект синхронизации.If a name is provided and a synchronization object of the requested type already exists in the namespace, the existing synchronization object is opened. Если объект синхронизации другого типа уже существует в пространстве имен, создается WaitHandleCannotBeOpenedException исключение.If a synchronization object of a different type already exists in the namespace, a WaitHandleCannotBeOpenedException is thrown. В противном случае создается новый объект синхронизации.Otherwise, a new synchronization object is created.

Если системное событие с именем, указанным для name параметра, уже существует, initialState параметр игнорируется.If a system event with the name specified for the name parameter already exists, the initialState parameter is ignored. После вызова этого конструктора используйте значение в переменной, заданной для ref параметра ( ByRef параметр в Visual Basic) createdNew , чтобы определить, существовало ли именованное системное событие или оно было создано.After calling this constructor, use the value in the variable specified for the ref parameter (ByRef parameter in Visual Basic)createdNew to determine whether the named system event already existed or was created.

Если начальное состояние события является несигнальным, потоки, ожидающие события, будут блокироваться.If the initial state of the event is nonsignaled, threads that wait on the event will block. Если исходное состояние сигнальное, а ManualReset флаг задан для mode , потоки, ожидающие события, не будут блокироваться.If the initial state is signaled, and the ManualReset flag is specified for mode, threads that wait on the event will not block. Если начальное состояние сигнальное, а modeAutoReset , то первый поток, ожидающий события, будет немедленно освобожден, после чего событие будет сброшено, а последующие потоки будут блокироваться.If the initial state is signaled, and mode is AutoReset, the first thread that waits on the event will be released immediately, after which the event will reset, and subsequent threads will block.

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

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

EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity)

Инициализирует новый экземпляр класса EventWaitHandle с указанием следующих сведений: передавать ли сигнал в дескриптор ожидания при первичном запуске в результате этого вызова, выполнять ли сброс автоматически или вручную, имя системного события синхронизации, логическая переменная для сохранения информации о том, было ли создано именованное системное событие, правила управления доступом для именованного события, если оно создается.Initializes a new instance of the EventWaitHandle class, specifying whether the wait handle is initially signaled if created as a result of this call, whether it resets automatically or manually, the name of a system synchronization event, a Boolean variable whose value after the call indicates whether the named system event was created, and the access control security to be applied to the named event if it is created.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew, System::Security::AccessControl::EventWaitHandleSecurity ^ eventSecurity);
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew, System.Security.AccessControl.EventWaitHandleSecurity eventSecurity);
[System.Security.SecurityCritical]
public EventWaitHandle (bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew, System.Security.AccessControl.EventWaitHandleSecurity eventSecurity);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool * System.Security.AccessControl.EventWaitHandleSecurity -> System.Threading.EventWaitHandle
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool * System.Security.AccessControl.EventWaitHandleSecurity -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean, eventSecurity As EventWaitHandleSecurity)

Параметры

initialState
Boolean

Значение true обозначает, что именованное событие получит исходное сигнальное состояние, если такое событие создается в результате этого вызова; значение false устанавливает несигнальное состояние.true to set the initial state to signaled if the named event is created as a result of this call; false to set it to nonsignaled.

mode
EventResetMode

Одно из значений EventResetMode, которое определяет, выполняется ли сброс события автоматически или вручную.One of the EventResetMode values that determines whether the event resets automatically or manually.

name
String

Имя, если объект синхронизации должен использоваться совместно с другими процессами. В противном случае — null или пустая строка.The name, if the synchronization object is to be shared with other processes; otherwise, null or an empty string. Имя указано с учетом регистра.The name is case-sensitive.

createdNew
Boolean

Когда данный метод возвращает значение, он содержит true, если было создано локальное событие (то есть, если name имеет значение null или пустую строку) или было создано системное событие с заданным именем; либо значение false, если указанное именованное событие уже существовало.When this method returns, contains true if a local event was created (that is, if name is null or an empty string) or if the specified named system event was created; false if the specified named system event already existed. Этот параметр передается неинициализированным.This parameter is passed uninitialized.

eventSecurity
EventWaitHandleSecurity

Объект EventWaitHandleSecurity, определяющий настройки управления доступом для применения к именованному системному событию.An EventWaitHandleSecurity object that represents the access control security to be applied to the named system event.

Атрибуты

Исключения

name недопустим.name is invalid. Это исключение может возникнуть по разным причинам, включая некоторые ограничения, установленные операционной системой (например, в отношении использования неизвестных префиксов или недопустимых символов).This can be for various reasons, including some restrictions that may be placed by the operating system, such as an unknown prefix or invalid characters. Обратите внимание, что в имени и в стандартных префиксах "Global" и "Local" учитывается регистр.Note that the name and common prefixes "Global" and "Local" are case-sensitive.

- или --or-

Возникла другая ошибка.There was some other error. Дополнительные сведения можно получить с помощью свойства HResult.The HResult property may provide more information.

Только в Windows. Для name указано неизвестное пространство имен.Windows only: name specified an unknown namespace. Дополнительные сведения см. в статье Имена объектов.See Object Names for more information.

Слишком длинное значение name.The name is too long. Ограничения длины могут зависеть от операционной системы или конфигурации.Length restrictions may depend on the operating system or configuration.

Именованное событие уже существует и имеет настройки управления доступом, но пользователь не имеет прав FullControl.The named event exists and has access control security, but the user does not have FullControl.

Не удается создать объект синхронизации с указанным значением для параметра name.A synchronization object with the provided name cannot be created. Возможно, другой объект синхронизации имеет такое же имя.A synchronization object of a different type might have the same name.

Значение перечисления mode вышло за допустимый диапазон.The mode enum value was out of legal range.

- или --or-

Только в .NET Framework. name превышает значение MAX_PATH (260 символов)..NET Framework only: name is longer than MAX_PATH (260 characters).

Примеры

В следующем примере кода демонстрируется поведение перекрестной обработки именованного системного события с защитой управления доступом.The following code example demonstrates the cross-process behavior of a named system event with access control security. В примере OpenExisting(String) перегрузка метода используется для проверки существования именованного события.The example uses the OpenExisting(String) method overload to test for the existence of a named event.

Если событие не существует, оно создается с первоначальным владельцем и безопасностью контроля доступа, которая запрещает текущему пользователю право использовать событие, но предоставляет право на чтение и изменение для события.If the event does not exist, it is created with initial ownership and access control security that denies the current user the right to use the event, but grants the right to read and change permissions on the event.

Если запустить скомпилированный пример из двух окон командной строки, вторая копия выдаст исключение нарушения прав доступа при вызове OpenExisting(String) .If you run the compiled example from two command windows, the second copy will throw an access violation exception on the call to OpenExisting(String). Исключение перехвачено, а в примере OpenExisting(String, EventWaitHandleRights) перегрузка метода используется для ожидания события с правами, необходимыми для чтения и изменения разрешений.The exception is caught, and the example uses the OpenExisting(String, EventWaitHandleRights) method overload to wait on the event with the rights needed to read and change the permissions.

После изменения разрешений открывается событие с правами, необходимыми для его ожидания и сигналом.After the permissions are changed, the event is opened with the rights required to wait on it and signal it. Если запустить скомпилированный пример из третьего командного окна, пример выполняется с использованием новых разрешений.If you run the compiled example from a third command window, the example runs using the new permissions.

using namespace System;
using namespace System::Threading;
using namespace System::Security::AccessControl;
using namespace System::Security::Permissions;

public ref class Example
{
public:
   [SecurityPermissionAttribute(SecurityAction::Demand,Flags=SecurityPermissionFlag::UnmanagedCode)]
   static void Main()
   {
      String^ ewhName = L"EventWaitHandleExample5";

      EventWaitHandle^ ewh = nullptr;
      bool doesNotExist = false;
      bool unauthorized = false;
      
      // The value of this variable is set by the event
      // constructor. It is true if the named system event was
      // created, and false if the named event already existed.
      //
      bool wasCreated;
      
      // Attempt to open the named event.
      try
      {
         // Open the event with (EventWaitHandleRights.Synchronize
         // | EventWaitHandleRights.Modify), to wait on and
         // signal the named event.
         //
         ewh = EventWaitHandle::OpenExisting( ewhName );
      }
      catch ( WaitHandleCannotBeOpenedException^ ) 
      {
         Console::WriteLine( L"Named event does not exist." );
         doesNotExist = true;
      }
      catch ( UnauthorizedAccessException^ ex ) 
      {
         Console::WriteLine( L"Unauthorized access: {0}", ex->Message );
         unauthorized = true;
      }

      // There are three cases: (1) The event does not exist.
      // (2) The event exists, but the current user doesn't
      // have access. (3) The event exists and the user has
      // access.
      //
      if ( doesNotExist )
      {
         // The event does not exist, so create it.

         // Create an access control list (ACL) that denies the
         // current user the right to wait on or signal the
         // event, but allows the right to read and change
         // security information for the event.
         //
         String^ user = String::Concat( Environment::UserDomainName, L"\\",
            Environment::UserName );
         EventWaitHandleSecurity^ ewhSec = gcnew EventWaitHandleSecurity;
         //following constructor fails
         EventWaitHandleAccessRule^ rule = gcnew EventWaitHandleAccessRule(
            user,
            static_cast<EventWaitHandleRights>(
               EventWaitHandleRights::Synchronize | 
               EventWaitHandleRights::Modify),
            AccessControlType::Deny );
         ewhSec->AddAccessRule( rule );

         rule = gcnew EventWaitHandleAccessRule( user,
            static_cast<EventWaitHandleRights>(
               EventWaitHandleRights::ReadPermissions | 
               EventWaitHandleRights::ChangePermissions),
            AccessControlType::Allow );
         ewhSec->AddAccessRule( rule );
         
         // Create an EventWaitHandle object that represents
         // the system event named by the constant 'ewhName',
         // initially signaled, with automatic reset, and with
         // the specified security access. The Boolean value that
         // indicates creation of the underlying system object
         // is placed in wasCreated.
         //
         ewh = gcnew EventWaitHandle( true,
            EventResetMode::AutoReset,
            ewhName,
            wasCreated,
            ewhSec );
         
         // If the named system event was created, it can be
         // used by the current instance of this program, even
         // though the current user is denied access. The current
         // program owns the event. Otherwise, exit the program.
         //
         if ( wasCreated )
         {
            Console::WriteLine( L"Created the named event." );
         }
         else
         {
            Console::WriteLine( L"Unable to create the event." );
            return;
         }
      }
      else if ( unauthorized )
      {
         // Open the event to read and change the access control
         // security. The access control security defined above
         // allows the current user to do this.
         //
         try
         {
            ewh = EventWaitHandle::OpenExisting( ewhName, 
               static_cast<EventWaitHandleRights>(
                  EventWaitHandleRights::ReadPermissions |
                  EventWaitHandleRights::ChangePermissions) );
            
            // Get the current ACL. This requires
            // EventWaitHandleRights.ReadPermissions.
            EventWaitHandleSecurity^ ewhSec = ewh->GetAccessControl();
            String^ user = String::Concat( Environment::UserDomainName, L"\\",
               Environment::UserName );
            
            // First, the rule that denied the current user
            // the right to enter and release the event must
            // be removed.
            EventWaitHandleAccessRule^ rule = gcnew EventWaitHandleAccessRule(
               user,
               static_cast<EventWaitHandleRights>(
                  EventWaitHandleRights::Synchronize |
                  EventWaitHandleRights::Modify),
               AccessControlType::Deny );
            ewhSec->RemoveAccessRule( rule );
            
            // Now grant the user the correct rights.
            //
            rule = gcnew EventWaitHandleAccessRule( user,
               static_cast<EventWaitHandleRights>(
                  EventWaitHandleRights::Synchronize |
                  EventWaitHandleRights::Modify),
               AccessControlType::Allow );
            ewhSec->AddAccessRule( rule );
            
            // Update the ACL. This requires
            // EventWaitHandleRights.ChangePermissions.
            ewh->SetAccessControl( ewhSec );
            Console::WriteLine( L"Updated event security." );
            
            // Open the event with (EventWaitHandleRights.Synchronize
            // | EventWaitHandleRights.Modify), the rights required
            // to wait on and signal the event.
            //
            ewh = EventWaitHandle::OpenExisting( ewhName );
         }
         catch ( UnauthorizedAccessException^ ex ) 
         {
            Console::WriteLine( L"Unable to change permissions: {0}",
               ex->Message );
            return;
         }

      }
      
      // Wait on the event, and hold it until the program
      // exits.
      //
      try
      {
         Console::WriteLine( L"Wait on the event." );
         ewh->WaitOne();
         Console::WriteLine( L"Event was signaled." );
         Console::WriteLine( L"Press the Enter key to signal the event and exit." );
         Console::ReadLine();
      }
      catch ( UnauthorizedAccessException^ ex ) 
      {
         Console::WriteLine( L"Unauthorized access: {0}", ex->Message );
      }
      finally
      {
         ewh->Set();
      }
   }
};

int main()
{
   Example::Main();
}
using System;
using System.Threading;
using System.Security.AccessControl;

internal class Example
{
    internal static void Main()
    {
        const string ewhName = "EventWaitHandleExample5";

        EventWaitHandle ewh = null;
        bool doesNotExist = false;
        bool unauthorized = false;

        // The value of this variable is set by the event
        // constructor. It is true if the named system event was
        // created, and false if the named event already existed.
        //
        bool wasCreated;

        // Attempt to open the named event.
        try
        {
            // Open the event with (EventWaitHandleRights.Synchronize
            // | EventWaitHandleRights.Modify), to wait on and 
            // signal the named event.
            //
            ewh = EventWaitHandle.OpenExisting(ewhName);
        }
        catch (WaitHandleCannotBeOpenedException)
        {
            Console.WriteLine("Named event does not exist.");
            doesNotExist = true;
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
            unauthorized = true;
        }

        // There are three cases: (1) The event does not exist.
        // (2) The event exists, but the current user doesn't 
        // have access. (3) The event exists and the user has
        // access.
        //
        if (doesNotExist)
        {
            // The event does not exist, so create it.

            // Create an access control list (ACL) that denies the
            // current user the right to wait on or signal the 
            // event, but allows the right to read and change
            // security information for the event.
            //
            string user = Environment.UserDomainName + "\\"
                + Environment.UserName;
            EventWaitHandleSecurity ewhSec = 
                new EventWaitHandleSecurity();

            EventWaitHandleAccessRule rule = 
                new EventWaitHandleAccessRule(user, 
                    EventWaitHandleRights.Synchronize | 
                    EventWaitHandleRights.Modify, 
                    AccessControlType.Deny);
            ewhSec.AddAccessRule(rule);

            rule = new EventWaitHandleAccessRule(user, 
                EventWaitHandleRights.ReadPermissions | 
                EventWaitHandleRights.ChangePermissions, 
                AccessControlType.Allow);
            ewhSec.AddAccessRule(rule);

            // Create an EventWaitHandle object that represents
            // the system event named by the constant 'ewhName', 
            // initially signaled, with automatic reset, and with
            // the specified security access. The Boolean value that 
            // indicates creation of the underlying system object
            // is placed in wasCreated.
            //
            ewh = new EventWaitHandle(true, 
                EventResetMode.AutoReset, 
                ewhName, 
                out wasCreated, 
                ewhSec);

            // If the named system event was created, it can be
            // used by the current instance of this program, even 
            // though the current user is denied access. The current
            // program owns the event. Otherwise, exit the program.
            // 
            if (wasCreated)
            {
                Console.WriteLine("Created the named event.");
            }
            else
            {
                Console.WriteLine("Unable to create the event.");
                return;
            }
        }
        else if (unauthorized)
        {
            // Open the event to read and change the access control
            // security. The access control security defined above
            // allows the current user to do this.
            //
            try
            {
                ewh = EventWaitHandle.OpenExisting(ewhName, 
                    EventWaitHandleRights.ReadPermissions | 
                    EventWaitHandleRights.ChangePermissions);

                // Get the current ACL. This requires 
                // EventWaitHandleRights.ReadPermissions.
                EventWaitHandleSecurity ewhSec = ewh.GetAccessControl();
                
                string user = Environment.UserDomainName + "\\"
                    + Environment.UserName;

                // First, the rule that denied the current user 
                // the right to enter and release the event must
                // be removed.
                EventWaitHandleAccessRule rule = 
                    new EventWaitHandleAccessRule(user, 
                        EventWaitHandleRights.Synchronize | 
                        EventWaitHandleRights.Modify, 
                        AccessControlType.Deny);
                ewhSec.RemoveAccessRule(rule);

                // Now grant the user the correct rights.
                // 
                rule = new EventWaitHandleAccessRule(user, 
                    EventWaitHandleRights.Synchronize | 
                    EventWaitHandleRights.Modify, 
                    AccessControlType.Allow);
                ewhSec.AddAccessRule(rule);

                // Update the ACL. This requires
                // EventWaitHandleRights.ChangePermissions.
                ewh.SetAccessControl(ewhSec);

                Console.WriteLine("Updated event security.");

                // Open the event with (EventWaitHandleRights.Synchronize 
                // | EventWaitHandleRights.Modify), the rights required
                // to wait on and signal the event.
                //
                ewh = EventWaitHandle.OpenExisting(ewhName);
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine("Unable to change permissions: {0}",
                    ex.Message);
                return;
            }
        }

        // Wait on the event, and hold it until the program
        // exits.
        //
        try
        {
            Console.WriteLine("Wait on the event.");
            ewh.WaitOne();
            Console.WriteLine("Event was signaled.");
            Console.WriteLine("Press the Enter key to signal the event and exit.");
            Console.ReadLine();
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
        }
        finally
        {
            ewh.Set();
        }
    }
}
Imports System.Threading
Imports System.Security.AccessControl

Friend Class Example

    <MTAThread> _
    Friend Shared Sub Main()
        Const ewhName As String = "EventWaitHandleExample5"

        Dim ewh As EventWaitHandle = Nothing
        Dim doesNotExist as Boolean = False
        Dim unauthorized As Boolean = False

        ' The value of this variable is set by the event
        ' constructor. It is True if the named system event was
        ' created, and False if the named event already existed.
        '
        Dim wasCreated As Boolean

        ' Attempt to open the named event.
        Try
            ' Open the event with (EventWaitHandleRights.Synchronize
            ' Or EventWaitHandleRights.Modify), to wait on and 
            ' signal the named event.
            '
            ewh = EventWaitHandle.OpenExisting(ewhName)
        Catch ex As WaitHandleCannotBeOpenedException
            Console.WriteLine("Named event does not exist.")
            doesNotExist = True
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", ex.Message)
            unauthorized = True
        End Try

        ' There are three cases: (1) The event does not exist.
        ' (2) The event exists, but the current user doesn't 
        ' have access. (3) The event exists and the user has
        ' access.
        '
        If doesNotExist Then
            ' The event does not exist, so create it.

            ' Create an access control list (ACL) that denies the
            ' current user the right to wait on or signal the 
            ' event, but allows the right to read and change
            ' security information for the event.
            '
            Dim user As String = Environment.UserDomainName _ 
                & "\" & Environment.UserName
            Dim ewhSec As New EventWaitHandleSecurity()

            Dim rule As New EventWaitHandleAccessRule(user, _
                EventWaitHandleRights.Synchronize Or _
                EventWaitHandleRights.Modify, _
                AccessControlType.Deny)
            ewhSec.AddAccessRule(rule)

            rule = New EventWaitHandleAccessRule(user, _
                EventWaitHandleRights.ReadPermissions Or _
                EventWaitHandleRights.ChangePermissions, _
                AccessControlType.Allow)
            ewhSec.AddAccessRule(rule)

            ' Create an EventWaitHandle object that represents
            ' the system event named by the constant 'ewhName', 
            ' initially signaled, with automatic reset, and with
            ' the specified security access. The Boolean value that 
            ' indicates creation of the underlying system object
            ' is placed in wasCreated.
            '
            ewh = New EventWaitHandle(True, _
                EventResetMode.AutoReset, ewhName, _
                wasCreated, ewhSec)

            ' If the named system event was created, it can be
            ' used by the current instance of this program, even 
            ' though the current user is denied access. The current
            ' program owns the event. Otherwise, exit the program.
            ' 
            If wasCreated Then
                Console.WriteLine("Created the named event.")
            Else
                Console.WriteLine("Unable to create the event.")
                Return
            End If

        ElseIf unauthorized Then

            ' Open the event to read and change the access control
            ' security. The access control security defined above
            ' allows the current user to do this.
            '
            Try
                ewh = EventWaitHandle.OpenExisting(ewhName, _
                    EventWaitHandleRights.ReadPermissions Or _
                    EventWaitHandleRights.ChangePermissions)

                ' Get the current ACL. This requires 
                ' EventWaitHandleRights.ReadPermissions.
                Dim ewhSec As EventWaitHandleSecurity = _
                    ewh.GetAccessControl()
                
                Dim user As String = Environment.UserDomainName _ 
                    & "\" & Environment.UserName

                ' First, the rule that denied the current user 
                ' the right to enter and release the event must
                ' be removed.
                Dim rule As New EventWaitHandleAccessRule(user, _
                    EventWaitHandleRights.Synchronize Or _
                    EventWaitHandleRights.Modify, _
                    AccessControlType.Deny)
                ewhSec.RemoveAccessRule(rule)

                ' Now grant the user the correct rights.
                ' 
                rule = New EventWaitHandleAccessRule(user, _
                    EventWaitHandleRights.Synchronize Or _
                    EventWaitHandleRights.Modify, _
                    AccessControlType.Allow)
                ewhSec.AddAccessRule(rule)

                ' Update the ACL. This requires
                ' EventWaitHandleRights.ChangePermissions.
                ewh.SetAccessControl(ewhSec)

                Console.WriteLine("Updated event security.")

                ' Open the event with (EventWaitHandleRights.Synchronize 
                ' Or EventWaitHandleRights.Modify), the rights required
                ' to wait on and signal the event.
                '
                ewh = EventWaitHandle.OpenExisting(ewhName)

            Catch ex As UnauthorizedAccessException
                Console.WriteLine("Unable to change permissions: {0}", _
                    ex.Message)
                Return
            End Try

        End If

        ' Wait on the event, and hold it until the program
        ' exits.
        '
        Try
            Console.WriteLine("Wait on the event.")
            ewh.WaitOne()
            Console.WriteLine("Event was signaled.")
            Console.WriteLine("Press the Enter key to signal the event and exit.")
            Console.ReadLine()
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", _
                ex.Message)
        Finally
            ewh.Set()
        End Try
    End Sub 
End Class 

Комментарии

Используйте этот конструктор, чтобы применить безопасность управления доступом к именованному системному событию при его создании, предотвращая управление событием другим кодом.Use this constructor to apply access control security to a named system event when it is created, preventing other code from taking control of the event.

Этот конструктор инициализирует EventWaitHandle объект, представляющий системное событие.This constructor initializes an EventWaitHandle object that represents a system event. Можно создать несколько EventWaitHandle объектов, представляющих одно и то же системное событие.You can create multiple EventWaitHandle objects that represent the same system event.

Если системное событие не существует, оно создается с указанной защитой управления доступом.If the system event does not exist, it is created with the specified access control security. Если событие существует, заданная безопасность контроля доступа игнорируется.If the event exists, the specified access control security is ignored.

Примечание

Вызывающий объект имеет полный контроль над вновь созданным EventWaitHandle объектом, даже если он eventSecurity запрещает или не может предоставить некоторые права доступа для текущего пользователя.The caller has full control over the newly created EventWaitHandle object even if eventSecurity denies or fails to grant some access rights to the current user. Однако, если текущий пользователь пытается получить другой EventWaitHandle объект для представления того же именованного события с помощью конструктора или OpenExisting метода, применяется безопасность управления доступом Windows.However, if the current user attempts to get another EventWaitHandle object to represent the same named event, using either a constructor or the OpenExisting method, Windows access control security is applied.

name Global\ Local\ Для можно указать пространство имен с префиксом или.The name may be prefixed with Global\ or Local\ to specify a namespace. Если Global указано пространство имен, объект синхронизации может быть общим для любых процессов в системе.When the Global namespace is specified, the synchronization object may be shared with any processes on the system. Если Local задано пространство имен, которое также используется по умолчанию, если пространство имен не указано, то объект синхронизации может совместно использоваться процессами в одном сеансе.When the Local namespace is specified, which is also the default when no namespace is specified, the synchronization object may be shared with processes in the same session. В Windows сеансом является сеанс входа в систему, и службы обычно выполняются в другом неинтерактивном сеансе.On Windows, a session is a login session, and services typically run in a different non-interactive session. В операционных системах, аналогичных UNIX, каждая оболочка имеет собственный сеанс.On Unix-like operating systems, each shell has its own session. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением "родители-потомки", где все они выполняются в одном сеансе.Session-local synchronization objects may be appropriate for synchronizing between processes with a parent/child relationship where they all run in the same session. Дополнительные сведения об именах объектов синчорнизатион в Windows см. в разделе имена объектов.For more information about synchornization object names on Windows, see Object Names.

Если name предоставляется и объект синхронизации запрошенного типа уже существует в пространстве имен, то открывается существующий объект синхронизации.If a name is provided and a synchronization object of the requested type already exists in the namespace, the existing synchronization object is opened. Если объект синхронизации другого типа уже существует в пространстве имен, создается WaitHandleCannotBeOpenedException исключение.If a synchronization object of a different type already exists in the namespace, a WaitHandleCannotBeOpenedException is thrown. В противном случае создается новый объект синхронизации.Otherwise, a new synchronization object is created.

Если системное событие с именем, указанным для name параметра, уже существует, initialState параметр игнорируется.If a system event with the name specified for the name parameter already exists, the initialState parameter is ignored. После вызова этого конструктора используйте значение в переменной, заданной для ref параметра ( ByRef параметр в Visual Basic) createdNew , чтобы определить, существовало ли именованное системное событие или оно было создано.After calling this constructor, use the value in the variable specified for the ref parameter (ByRef parameter in Visual Basic) createdNew to determine whether the named system event already existed or was created.

Если начальное состояние события является несигнальным, потоки, ожидающие события, будут блокироваться.If the initial state of the event is nonsignaled, threads that wait on the event will block. Если исходное состояние сигнальное, а ManualReset флаг задан для mode , потоки, ожидающие события, не будут блокироваться.If the initial state is signaled, and the ManualReset flag is specified for mode, threads that wait on the event will not block. Если начальное состояние сигнальное, а modeAutoReset , то первый поток, ожидающий события, будет немедленно освобожден, после чего событие будет сброшено, а последующие потоки будут блокироваться.If the initial state is signaled, and mode is AutoReset, the first thread that waits on the event will be released immediately, after which the event will reset, and subsequent threads will block.

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

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