EventWaitHandle Construtores
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Inicializa uma nova instância da EventWaitHandle classe.
Sobrecargas
| Name | Descrição |
|---|---|
| EventWaitHandle(Boolean, EventResetMode) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado e se reinicia automaticamente ou manualmente. |
| EventWaitHandle(Boolean, EventResetMode, String) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, e o nome de um evento de sincronização do sistema. |
| EventWaitHandle(Boolean, EventResetMode, String, Boolean) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, e uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema e opções para definir o acesso ao âmbito do utilizador e ao âmbito da sessão. |
| EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado, e a segurança do controlo de acesso a ser aplicada ao evento nomeado caso este seja criado. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean) |
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, opções para definir o acesso ao âmbito do utilizador e ao âmbito da sessão, e uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado. |
EventWaitHandle(Boolean, EventResetMode)
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado e se reinicia automaticamente ou manualmente.
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)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
Exceções
O mode valor de enum estava fora do alcance legal.
Exemplos
O exemplo de código seguinte usa o SignalAndWait(WaitHandle, WaitHandle) método overload para permitir que o thread principal sinalize um thread bloqueado e depois espere até que o thread termine uma tarefa.
O exemplo inicia cinco threads e permite-lhes bloquear num EventWaitHandle criado com a EventResetMode.AutoReset flag, libertando depois um thread cada vez que o utilizador pressiona a tecla Enter . O exemplo coloca então mais cinco threads e liberta-os todos usando um EventWaitHandle created with the EventResetMode.ManualReset flag.
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
Observações
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, os threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
Ver também
Aplica-se a
EventWaitHandle(Boolean, EventResetMode, String)
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, e o nome de um evento de sincronização do sistema.
public:
EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name);
[System.Security.SecurityCritical]
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name);
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado se o evento nomeado for criado como resultado desta chamada; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
- name
- String
O nome, se o objeto de sincronização for partilhado com outros processos; caso contrário, null ou uma cadeia vazia. O nome é sensível a maiúsculas e minúsculas. O carácter barra inversa (\) é reservado e só pode ser usado para especificar um namespace. Para mais informações sobre namespaces, consulte a secção de observações. Pode haver restrições adicionais ao nome dependendo do sistema operativo. Por exemplo, em sistemas operativos baseados em Unix, o nome após excluir o espaço de nomes deve ser um nome de ficheiro válido.
- Atributos
Exceções
name é inválido. Isto pode dever-se a várias razões, incluindo algumas restrições que podem ser impostas pelo sistema operativo, como um prefixo desconhecido ou caracteres inválidos. Note que o nome e os prefixos comuns "Global\" e "Local\" são sensíveis a maiúsculas minúsculas.
-ou-
Houve outro erro. A HResult propriedade pode fornecer mais informações.
Windows apenas: name especificava um namespace desconhecido. Consulte Nomes dos Objetos para mais informações.
O name é demasiado longo. As restrições de comprimento podem depender do sistema operativo ou da configuração.
O evento nomeado existe e tem segurança de controlo de acesso, mas o utilizador não tem FullControl.
Um objeto de sincronização com o fornecido name não pode ser criado. Um objeto de sincronização de outro tipo pode ter o mesmo nome.
O mode valor de enum estava fora do alcance legal.
-ou-
.NET Framework apenas: name é mais longo que MAX_PATH (260 caracteres).
Observações
Podem name ser precedidos por Global\ ou Local\ para especificar um namespace. Quando o Global namespace é especificado, o objeto de sincronização pode ser partilhado com quaisquer processos no sistema. Quando o Local namespace é especificado, que também é o padrão quando não há namespace especificado, o objeto de sincronização pode ser partilhado com processos na mesma sessão. No Windows, uma sessão é uma sessão de login, e os serviços normalmente correm numa sessão diferente e não interativa. Em sistemas operativos do tipo Unix, cada shell tem a sua própria sessão. Objetos de sincronização local de sessão podem ser apropriados para sincronizar processos com uma relação pai/filho, onde todos correm na mesma sessão. Para mais informações sobre nomes de objetos de sincronização no Windows, veja Object Names.
Se a name for fornecido e um objeto de sincronização do tipo solicitado já existir no namespace, o objeto de sincronização existente é aberto. Se já existir um objeto de sincronização de outro tipo no namespace, um WaitHandleCannotBeOpenedException lançamento é lançado. Caso contrário, é criado um novo objeto de sincronização.
Se já existir um evento do sistema com o nome especificado para o name parâmetro, o initialState parâmetro é ignorado.
Atenção
Por defeito, um evento nomeado não está restrito ao utilizador que o criou. Outros utilizadores podem conseguir abrir e usar o evento, incluindo interferir com o evento ao configurá-lo ou reiniciá-lo de forma inadequada. Para restringir o acesso a utilizadores específicos, pode usar um constructor overload ou EventWaitHandleAcl e passar um an EventWaitHandleSecurity ao criar o evento nomeado. Evite usar eventos nomeados sem restrições de acesso em sistemas que possam ter utilizadores não confiáveis a executar código.
Importante
Ao usar este construtor para eventos do sistema nomeado, especifique false para initialState. Este construtor não fornece forma de determinar se um evento do sistema nomeado foi criado, pelo que não pode fazer quaisquer suposições sobre o estado do evento nomeado. Para determinar se um evento nomeado foi criado, use o EventWaitHandle(Boolean, EventResetMode, String, Boolean) construtor ou o EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) construtor.
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, os threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
Ver também
Aplica-se a
EventWaitHandle(Boolean, EventResetMode, String, Boolean)
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, e uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado.
public:
EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew);
[System.Security.SecurityCritical]
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, out bool createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool -> System.Threading.EventWaitHandle
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)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado se o evento nomeado for criado como resultado desta chamada; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
- name
- String
O nome, se o objeto de sincronização for partilhado com outros processos; caso contrário, null ou uma cadeia vazia. O nome é sensível a maiúsculas e minúsculas. O carácter barra inversa (\) é reservado e só pode ser usado para especificar um namespace. Para mais informações sobre namespaces, consulte a secção de observações. Pode haver restrições adicionais ao nome dependendo do sistema operativo. Por exemplo, em sistemas operativos baseados em Unix, o nome após excluir o espaço de nomes deve ser um nome de ficheiro válido.
- createdNew
- Boolean
Quando este método retorna, contém true se foi criado um evento local (isto é, se name for null ou uma cadeia vazia) ou se o evento de sistema nomeado especificado foi criado; false se o evento de sistema nomeado especificado já existisse. Este parâmetro é passado sem inicializar.
- Atributos
Exceções
name é inválido. Isto pode dever-se a várias razões, incluindo algumas restrições que podem ser impostas pelo sistema operativo, como um prefixo desconhecido ou caracteres inválidos. Note que o nome e os prefixos comuns "Global\" e "Local\" são sensíveis a maiúsculas minúsculas.
-ou-
Houve outro erro. A HResult propriedade pode fornecer mais informações.
Windows apenas: name especificava um namespace desconhecido. Consulte Nomes dos Objetos para mais informações.
O name é demasiado longo. As restrições de comprimento podem depender do sistema operativo ou da configuração.
O evento nomeado existe e tem segurança de controlo de acesso, mas o utilizador não tem FullControl.
Um objeto de sincronização com o fornecido name não pode ser criado. Um objeto de sincronização de outro tipo pode ter o mesmo nome.
O mode valor de enum estava fora do alcance legal.
-ou-
.NET Framework apenas: name é mais longo que MAX_PATH (260 caracteres).
Observações
Podem name ser precedidos por Global\ ou Local\ para especificar um namespace. Quando o Global namespace é especificado, o objeto de sincronização pode ser partilhado com quaisquer processos no sistema. Quando o Local namespace é especificado, que também é o padrão quando não há namespace especificado, o objeto de sincronização pode ser partilhado com processos na mesma sessão. No Windows, uma sessão é uma sessão de login, e os serviços normalmente correm numa sessão diferente e não interativa. Em sistemas operativos do tipo Unix, cada shell tem a sua própria sessão. Objetos de sincronização local de sessão podem ser apropriados para sincronizar processos com uma relação pai/filho, onde todos correm na mesma sessão. Para mais informações sobre nomes de objetos de sincronização no Windows, veja Object Names.
Se a name for fornecido e um objeto de sincronização do tipo solicitado já existir no namespace, o objeto de sincronização existente é aberto. Se já existir um objeto de sincronização de outro tipo no namespace, um WaitHandleCannotBeOpenedException lançamento é lançado. Caso contrário, é criado um novo objeto de sincronização.
Se já existir um evento do sistema com o nome especificado para o name parâmetro, o initialState parâmetro é ignorado. Depois de chamar este construtor, use o valor na variável especificado para o parâmetro ref (ByRef parâmetro em Visual Basic)createdNew para determinar se o evento do sistema nomeado já existia ou foi criado.
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, os threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
Atenção
Por defeito, um evento nomeado não está restrito ao utilizador que o criou. Outros utilizadores podem conseguir abrir e usar o evento, incluindo interferir com o evento ao configurá-lo ou reiniciá-lo de forma inadequada. Para restringir o acesso a utilizadores específicos, pode usar um constructor overload ou EventWaitHandleAcl e passar um an EventWaitHandleSecurity ao criar o evento nomeado. Evite usar eventos nomeados sem restrições de acesso em sistemas que possam ter utilizadores não confiáveis a executar código.
Ver também
Aplica-se a
EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions)
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema e opções para definir o acesso ao âmbito do utilizador e ao âmbito da sessão.
public:
EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, System::Threading::NamedWaitHandleOptions options);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, System.Threading.NamedWaitHandleOptions options);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * System.Threading.NamedWaitHandleOptions -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, options As NamedWaitHandleOptions)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado se o evento nomeado for criado como resultado desta chamada; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
- name
- String
O nome, se o objeto de sincronização for partilhado com outros processos; caso contrário, null ou uma cadeia vazia. O nome é sensível a maiúsculas e minúsculas.
- options
- NamedWaitHandleOptions
As opções de mira para o cabo nomeado. Por defeito, o acesso é limitado apenas ao utilizador atual e à sessão atual. As opções especificadas podem afetar o namespace do nome e o acesso ao objeto handle subjacente.
Exceções
name é inválido. Isto pode dever-se a várias razões, incluindo algumas restrições que podem ser impostas pelo sistema operativo, como um prefixo desconhecido ou caracteres inválidos. Note que o nome e os prefixos comuns "Global\" e "Local\" são sensíveis a maiúsculas minúsculas.
-ou-
Houve outro erro. A HResult propriedade pode fornecer mais informações.
Windows apenas: name especificava um namespace desconhecido. Consulte Nomes dos Objetos para mais informações.
O name é demasiado longo. As restrições de comprimento podem depender do sistema operativo ou da configuração.
O evento nomeado existe e tem segurança de controlo de acesso, mas o utilizador não tem FullControl.
Um objeto de sincronização com o fornecido name não pode ser criado. Um objeto de sincronização de outro tipo pode ter o mesmo nome.
-ou-
Existe um objeto com o especificado name , mas os especificados options não são compatíveis com as opções do objeto existente.
O mode valor de enum estava fora do alcance legal.
Observações
Se a name for fornecido e um objeto de sincronização do tipo solicitado já existir no namespace, o objeto de sincronização existente é aberto. No entanto, se options especificar acesso limitado ao utilizador atual e o objeto de sincronização não for compatível com ele, um WaitHandleCannotBeOpenedException é lançado. Se já existir um objeto de sincronização de um tipo diferente no namespace, um WaitHandleCannotBeOpenedException também é lançado. Caso contrário, é criado um novo objeto de sincronização.
Se já existir um evento do sistema com o nome especificado para o name parâmetro, o initialState parâmetro é ignorado.
Importante
Ao usar este construtor para eventos do sistema nomeado, especifique false para initialState. Este construtor não fornece forma de determinar se um evento do sistema nomeado foi criado, por isso não se pode fazer suposições sobre o estado do evento nomeado. Para determinar se um evento nomeado foi criado, use o EventWaitHandle(Boolean, EventResetMode, String, Boolean) construtor ou o EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) construtor.
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
No Windows, pode ser fornecido options para especificar se o evento do sistema nomeado é acessível apenas ao utilizador atual ou a todos os utilizadores. Também permite especificar se o evento do sistema nomeado é acessível apenas a processos na sessão atual ou a todas as sessões. Para obter mais informações, veja NamedWaitHandleOptions.
Atenção
Em sistemas operativos baseados em Unix, o options parâmetro não tem efeito, pois eventos de sistema nomeados não são suportados.
Ver também
Aplica-se a
EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity)
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado, e a segurança do controlo de acesso a ser aplicada ao evento nomeado caso este seja criado.
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)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado se o evento nomeado for criado como resultado desta chamada; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
- name
- String
O nome, se o objeto de sincronização for partilhado com outros processos; caso contrário, null ou uma cadeia vazia. O nome é sensível a maiúsculas e minúsculas. O carácter barra inversa (\) é reservado e só pode ser usado para especificar um namespace. Para mais informações sobre namespaces, consulte a secção de observações. Pode haver restrições adicionais ao nome dependendo do sistema operativo. Por exemplo, em sistemas operativos baseados em Unix, o nome após excluir o espaço de nomes deve ser um nome de ficheiro válido.
- createdNew
- Boolean
Quando este método retorna, contém true se foi criado um evento local (isto é, se name for null ou uma cadeia vazia) ou se o evento de sistema nomeado especificado foi criado; false se o evento de sistema nomeado especificado já existisse. Este parâmetro é passado sem inicializar.
- eventSecurity
- EventWaitHandleSecurity
Um objeto que representa a segurança de controlo EventWaitHandleSecurity de acesso a ser aplicada ao evento do sistema nomeado.
- Atributos
Exceções
name é inválido. Isto pode dever-se a várias razões, incluindo algumas restrições que podem ser impostas pelo sistema operativo, como um prefixo desconhecido ou caracteres inválidos. Note que o nome e os prefixos comuns "Global\" e "Local\" são sensíveis a maiúsculas minúsculas.
-ou-
Houve outro erro. A HResult propriedade pode fornecer mais informações.
Windows apenas: name especificava um namespace desconhecido. Consulte Nomes dos Objetos para mais informações.
O name é demasiado longo. As restrições de comprimento podem depender do sistema operativo ou da configuração.
O evento nomeado existe e tem segurança de controlo de acesso, mas o utilizador não tem FullControl.
Um objeto de sincronização com o fornecido name não pode ser criado. Um objeto de sincronização de outro tipo pode ter o mesmo nome.
O mode valor de enum estava fora do alcance legal.
-ou-
.NET Framework apenas: name é mais longo que MAX_PATH (260 caracteres).
Exemplos
O exemplo de código seguinte demonstra o comportamento entre processos de um evento do sistema nomeado com segurança de controlo de acesso. O exemplo utiliza a OpenExisting(String) sobrecarga de métodos para testar a existência de um evento nomeado.
Se o evento não existir, é criado com propriedade inicial e segurança de controlo de acessos que nega ao utilizador atual o direito de usar o evento, mas concede o direito de ler e alterar permissões sobre o evento.
Se executares o exemplo compilado a partir de duas janelas de comandos, a segunda cópia irá lançar uma exceção de violação de acesso na chamada para OpenExisting(String). A exceção é apanhada, e o exemplo usa a OpenExisting(String, EventWaitHandleRights) sobrecarga de métodos para esperar pelo evento com os direitos necessários para ler e alterar as permissões.
Depois de as permissões serem alteradas, o evento é aberto com os direitos necessários para esperar e sinalizá-lo. Se executares o exemplo compilado a partir de uma terceira janela de comandos, o exemplo é executado usando as novas permissões.
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
Observações
Use este construtor para aplicar segurança de controlo de acesso a um evento do sistema nomeado quando este é criado, impedindo que outro código assuma o controlo do evento.
Este construtor inicializa um EventWaitHandle objeto que representa um evento do sistema. Podes criar múltiplos EventWaitHandle objetos que representam o mesmo evento do sistema.
Se o evento do sistema não existir, é criado com a segurança de controlo de acesso especificada. Se o evento existir, a segurança de controlo de acesso especificada é ignorada.
Note
O chamador tem controlo total sobre o objeto recém-criado EventWaitHandle , mesmo que eventSecurity negue ou não conceda alguns direitos de acesso ao utilizador atual. No entanto, se o utilizador atual tentar fazer com que outro objeto EventWaitHandle represente o mesmo evento nomeado, usando um construtor ou o método OpenExisting, é aplicada Windows segurança de controlo de acessos.
Podem name ser precedidos por Global\ ou Local\ para especificar um namespace. Quando o Global namespace é especificado, o objeto de sincronização pode ser partilhado com quaisquer processos no sistema. Quando o Local namespace é especificado, que também é o padrão quando não há namespace especificado, o objeto de sincronização pode ser partilhado com processos na mesma sessão. No Windows, uma sessão é uma sessão de login, e os serviços normalmente correm numa sessão diferente e não interativa. Em sistemas operativos do tipo Unix, cada shell tem a sua própria sessão. Objetos de sincronização local de sessão podem ser apropriados para sincronizar processos com uma relação pai/filho, onde todos correm na mesma sessão. Para mais informações sobre nomes de objetos de sincronização no Windows, veja Object Names.
Se a name for fornecido e um objeto de sincronização do tipo solicitado já existir no namespace, o objeto de sincronização existente é aberto. Se já existir um objeto de sincronização de outro tipo no namespace, um WaitHandleCannotBeOpenedException lançamento é lançado. Caso contrário, é criado um novo objeto de sincronização.
Se já existir um evento do sistema com o nome especificado para o name parâmetro, o initialState parâmetro é ignorado. Depois de chamar este construtor, use o valor na variável especificado para o parâmetro ref (ByRef parâmetro em Visual Basic) createdNew para determinar se o evento do sistema nomeado já existia ou foi criado.
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, os threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
Atenção
Por defeito, um evento nomeado não está restrito ao utilizador que o criou. Outros utilizadores podem conseguir abrir e usar o evento, incluindo interferir com o evento ao configurá-lo ou reiniciá-lo de forma inadequada. Para restringir o acesso a utilizadores específicos, pode passar um EventWaitHandleSecurity num ao criar o evento nomeado. Evite usar eventos nomeados sem restrições de acesso em sistemas que possam ter utilizadores não confiáveis a executar código.
Ver também
Aplica-se a
EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean)
- Origem:
- EventWaitHandle.cs
- Origem:
- EventWaitHandle.cs
Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, opções para definir o acesso ao âmbito do utilizador e ao âmbito da sessão, e uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado.
public:
EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, System::Threading::NamedWaitHandleOptions options, [Runtime::InteropServices::Out] bool % createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, System.Threading.NamedWaitHandleOptions options, out bool createdNew);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * System.Threading.NamedWaitHandleOptions * bool -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, options As NamedWaitHandleOptions, ByRef createdNew As Boolean)
Parâmetros
- initialState
- Boolean
true definir o estado inicial para sinalizado se o evento nomeado for criado como resultado desta chamada; false para o definir como não sinalizado.
- mode
- EventResetMode
Um dos EventResetMode valores que determina se o evento é reiniciado automaticamente ou manualmente.
- name
- String
O nome, se o objeto de sincronização for partilhado com outros processos; caso contrário, null ou uma cadeia vazia. O nome é sensível a maiúsculas e minúsculas.
- options
- NamedWaitHandleOptions
As opções de mira para o cabo nomeado. Por defeito, o acesso é limitado apenas ao utilizador atual e à sessão atual. As opções especificadas podem afetar o namespace do nome e o acesso ao objeto handle subjacente.
- createdNew
- Boolean
Quando este método regressa, contém true se foi criado um evento local (isto é, se name for null ou uma cadeia vazia) ou se o evento de sistema nomeado especificado foi criado; contém false se o evento de sistema nomeado especificado já existiu. Este parâmetro é passado sem inicializar.
Exceções
name é inválido. Isto pode dever-se a várias razões, incluindo algumas restrições que podem ser impostas pelo sistema operativo, como um prefixo desconhecido ou caracteres inválidos. Note que o nome e os prefixos comuns "Global\" e "Local\" são sensíveis a maiúsculas minúsculas.
-ou-
Houve outro erro. A HResult propriedade pode fornecer mais informações.
Windows apenas: name especificava um namespace desconhecido. Consulte Nomes dos Objetos para mais informações.
O name é demasiado longo. As restrições de comprimento podem depender do sistema operativo ou da configuração.
O evento nomeado existe e tem segurança de controlo de acesso, mas o utilizador não tem FullControl.
Um objeto de sincronização com o fornecido name não pode ser criado. Um objeto de sincronização de outro tipo pode ter o mesmo nome.
-ou-
Existe um objeto com o especificado name , mas os especificados options não são compatíveis com as opções do objeto existente.
O mode valor de enum estava fora do alcance legal.
Observações
Se a name for fornecido e um objeto de sincronização do tipo solicitado já existir no namespace, o objeto de sincronização existente é aberto. No entanto, se options especificar acesso limitado ao utilizador atual e o objeto de sincronização não for compatível com ele, um WaitHandleCannotBeOpenedException é lançado. Se já existir um objeto de sincronização de um tipo diferente no namespace, um WaitHandleCannotBeOpenedException também é lançado. Caso contrário, é criado um novo objeto de sincronização.
Se já existir um evento do sistema com o nome especificado para o name parâmetro, o initialState parâmetro é ignorado. Depois de chamar este construtor, use o valor na variável especificado para o parâmetro ref (ByRef parâmetro em Visual Basic) createdNew para determinar se o evento do sistema nomeado já existia ou foi criado.
Se o estado inicial do evento não for sinalizado, os threads que aguardam o evento irão bloquear-se. Se o estado inicial for sinalizado e a ManualReset flag for especificada para mode, os threads que aguardam o evento não irão bloquear. Se o estado inicial for sinalizado e mode for AutoReset, a primeira thread que aguarda o evento será imediatamente libertada, após o que o evento será reiniciado e as threads subsequentes serão bloqueadas.
No Windows, pode ser fornecido options para especificar se o evento do sistema nomeado é acessível apenas ao utilizador atual ou a todos os utilizadores. Também permite especificar se o evento do sistema nomeado é acessível apenas aos processos da sessão atual ou a todas as sessões. Para obter mais informações, veja NamedWaitHandleOptions.
Atenção
Em sistemas operativos baseados em Unix, o options parâmetro não tem efeito, pois eventos de sistema nomeados não são suportados.