WaitHandle Classe
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.
Encapsula objetos específicos do sistema operativo que aguardam acesso exclusivo a recursos partilhados.
public ref class WaitHandle abstract : IDisposable
public ref class WaitHandle abstract : MarshalByRefObject, IDisposable
public abstract class WaitHandle : IDisposable
public abstract class WaitHandle : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class WaitHandle : MarshalByRefObject, IDisposable
type WaitHandle = class
interface IDisposable
type WaitHandle = class
inherit MarshalByRefObject
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type WaitHandle = class
inherit MarshalByRefObject
interface IDisposable
Public MustInherit Class WaitHandle
Implements IDisposable
Public MustInherit Class WaitHandle
Inherits MarshalByRefObject
Implements IDisposable
- Herança
-
WaitHandle
- Herança
- Derivado
- Atributos
- Implementações
Exemplos
O exemplo de código seguinte mostra como dois threads podem realizar tarefas em segundo plano enquanto o thread principal espera que as tarefas sejam concluídas, usando o static WaitAny e WaitAll os métodos da WaitHandle classe.
using System;
using System.Threading;
public sealed class App
{
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};
// Define a random number generator for testing.
static Random r = new Random();
static void Main()
{
// Queue up two tasks on two different threads;
// wait until all tasks are completed.
DateTime dt = DateTime.Now;
Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
WaitHandle.WaitAll(waitHandles);
// The time shown below should match the longest task.
Console.WriteLine("Both tasks are completed (time waited={0})",
(DateTime.Now - dt).TotalMilliseconds);
// Queue up two tasks on two different threads;
// wait until any task is completed.
dt = DateTime.Now;
Console.WriteLine();
Console.WriteLine("The main thread is waiting for either task to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
int index = WaitHandle.WaitAny(waitHandles);
// The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).",
index + 1, (DateTime.Now - dt).TotalMilliseconds);
}
static void DoTask(Object state)
{
AutoResetEvent are = (AutoResetEvent) state;
int time = 1000 * r.Next(2, 10);
Console.WriteLine("Performing a task for {0} milliseconds.", time);
Thread.Sleep(time);
are.Set();
}
}
// This code produces output similar to the following:
//
// Main thread is waiting for BOTH tasks to complete.
// Performing a task for 7000 milliseconds.
// Performing a task for 4000 milliseconds.
// Both tasks are completed (time waited=7064.8052)
//
// The main thread is waiting for either task to complete.
// Performing a task for 2000 milliseconds.
// Performing a task for 2000 milliseconds.
// Task 1 finished first (time waited=2000.6528).
Imports System.Threading
NotInheritable Public Class App
' Define an array with two AutoResetEvent WaitHandles.
Private Shared waitHandles() As WaitHandle = _
{New AutoResetEvent(False), New AutoResetEvent(False)}
' Define a random number generator for testing.
Private Shared r As New Random()
<MTAThreadAttribute> _
Public Shared Sub Main()
' Queue two tasks on two different threads;
' wait until all tasks are completed.
Dim dt As DateTime = DateTime.Now
Console.WriteLine("Main thread is waiting for BOTH tasks to complete.")
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
WaitHandle.WaitAll(waitHandles)
' The time shown below should match the longest task.
Console.WriteLine("Both tasks are completed (time waited={0})", _
(DateTime.Now - dt).TotalMilliseconds)
' Queue up two tasks on two different threads;
' wait until any tasks are completed.
dt = DateTime.Now
Console.WriteLine()
Console.WriteLine("The main thread is waiting for either task to complete.")
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
Dim index As Integer = WaitHandle.WaitAny(waitHandles)
' The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).", _
index + 1,(DateTime.Now - dt).TotalMilliseconds)
End Sub
Shared Sub DoTask(ByVal state As [Object])
Dim are As AutoResetEvent = CType(state, AutoResetEvent)
Dim time As Integer = 1000 * r.Next(2, 10)
Console.WriteLine("Performing a task for {0} milliseconds.", time)
Thread.Sleep(time)
are.Set()
End Sub
End Class
' This code produces output similar to the following:
'
' Main thread is waiting for BOTH tasks to complete.
' Performing a task for 7000 milliseconds.
' Performing a task for 4000 milliseconds.
' Both tasks are completed (time waited=7064.8052)
'
' The main thread is waiting for either task to complete.
' Performing a task for 2000 milliseconds.
' Performing a task for 2000 milliseconds.
' Task 1 finished first (time waited=2000.6528).
Observações
A WaitHandle classe encapsula um handle nativo de sincronização do sistema operativo e é usada para representar todos os objetos de sincronização no runtime que permitem múltiplas operações de espera. Para uma comparação entre os handles de espera com outros objetos de sincronização, veja Visão Geral das Primitivas de Sincronização.
A WaitHandle própria classe é abstrata. As classes derivadas de WaitHandle definem um mecanismo de sinalização para indicar a tomada ou libertação do acesso a um recurso partilhado, mas usam os métodos herdados WaitHandle para bloquear enquanto se espera acesso a recursos partilhados. As classes derivadas incluem WaitHandle :
A EventWaitHandle classe e as suas classes derivadas, AutoResetEvent e ManualResetEvent.
A Semaphore classe. Veja Semáforo e Semáforo Slim.
Os threads podem bloquear num handle de espera individual chamando o método WaitOnede instância , que é herdado por classes derivadas de WaitHandle.
As classes derivadas de WaitHandle diferem na sua afinidade por threads. Handles de espera de eventos (EventWaitHandle, AutoResetEvent, e ManualResetEvent) e semáforos não têm afinidade de thread; qualquer thread pode sinalizar um handle de espera de evento ou semáforo. Os mutexes, por outro lado, têm afinidade por fios; O thread que possui um mutex deve libertá-lo, e uma exceção é lançada se um thread chamar o ReleaseMutex método num mutex que não possui.
Como a WaitHandle classe deriva de MarshalByRefObject, estas classes podem ser usadas para sincronizar as atividades dos threads através dos limites do domínio da aplicação.
Para além das suas classes derivadas, a WaitHandle classe possui vários métodos estáticos que bloqueiam um thread até que um ou mais objetos de sincronização recebam um sinal. Estes são, entre outros:
SignalAndWait, que permite que um thread sinalize uma alça de espera e aguarde imediatamente noutra.
WaitAll, o que permite que um thread espere até que todos os handles de espera num array recebam um sinal.
WaitAny, o que permite que um thread espere até que qualquer um de um conjunto especificado de handles de espera seja sinalizado.
As sobrecargas destes métodos fornecem intervalos de timeout para abandonar a espera e a oportunidade de sair de um contexto de sincronização antes de entrar na espera, permitindo que outros threads usem o contexto de sincronização.
Importante
Este tipo implementa a interface IDisposable. Quando terminar de usar o tipo ou um tipo derivado dele, deve descartá-lo, direta ou indiretamente. Para descartar o tipo diretamente, chame seu método Close em um bloco try/catch. Para descartá-lo indiretamente, use uma construção de linguagem como using (em C#) ou Using (em Visual Basic). Para obter mais informações, consulte a seção "Usando um objeto que implementa IDisposable" no tópico da IDisposable interface.
WaitHandle implementa o Dispose padrão. Veja Implementar um método de Eliminação. Quando derivar de WaitHandle, use a SafeWaitHandle propriedade para armazenar o seu handle nativo do sistema operativo. Não precisa de sobrescrever o método protegido Dispose a menos que use recursos adicionais não geridos.
Construtores
| Name | Description |
|---|---|
| WaitHandle() |
Inicializa uma nova instância da WaitHandle classe. |
Campos
| Name | Description |
|---|---|
| InvalidHandle |
Representa um handle nativo do sistema operativo inválido. Este campo é só de leitura. |
| WaitTimeout |
Indica que uma WaitAny(WaitHandle[], Int32, Boolean) operação terminou antes de qualquer uma das alças de espera ser sinalizada. Este campo é constante. |
Propriedades
| Name | Description |
|---|---|
| Handle |
Obsoleto.
Obtém ou define o handle nativo do sistema operativo. |
| SafeWaitHandle |
Obtém ou define o handle nativo do sistema operativo. |
Métodos
| Name | Description |
|---|---|
| Close() |
Liberta todos os recursos detidos pelo atual WaitHandle. |
| CreateObjRef(Type) |
Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto. (Herdado de MarshalByRefObject) |
| Dispose() |
Liberta todos os recursos usados pela instância atual da WaitHandle classe. |
| Dispose(Boolean) |
Quando sobreposto numa classe derivada, liberta os recursos não geridos usados pelo WaitHandle, e opcionalmente liberta os recursos geridos. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| Finalize() |
Liberta os recursos detidos pela instância atual. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetLifetimeService() |
Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso. (Herdado de MarshalByRefObject) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| InitializeLifetimeService() |
Obtém-se um objeto de serviço vitalício para controlar a apólice vitalícia neste caso. (Herdado de MarshalByRefObject) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| MemberwiseClone(Boolean) |
Cria uma cópia superficial do objeto atual MarshalByRefObject . (Herdado de MarshalByRefObject) |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
Sinaliza um WaitHandle e espera noutro, especificando um intervalo de tempo como um inteiro assinado de 32 bits e especificando se deve sair do domínio de sincronização para o contexto antes de entrar na espera. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
Sinaliza um WaitHandle e espera noutro, especificando o intervalo de time-out como a TimeSpan e especificando se deve sair do domínio de sincronização para o contexto antes de entrar na espera. |
| SignalAndWait(WaitHandle, WaitHandle) |
Sinaliza um WaitHandle e espera pelo outro. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
| WaitAll(WaitHandle[], Int32, Boolean) |
Espera que todos os elementos do array especificado recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitAll(WaitHandle[], Int32) |
Espera que todos os elementos do array especificado recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo. |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Espera que todos os elementos do array especificado recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo, e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitAll(WaitHandle[], TimeSpan) |
Espera que todos os elementos do array especificado recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo. |
| WaitAll(WaitHandle[]) |
Espera que todos os elementos do array especificado recebam um sinal. |
| WaitAny(WaitHandle[], Int32, Boolean) |
Espera que qualquer um dos elementos do array especificado receba um sinal, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo, e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitAny(WaitHandle[], Int32) |
Espera que qualquer um dos elementos do array especificado receba um sinal, usando um inteiro com sinal de 32 bits para especificar o intervalo de tempo. |
| WaitAny(WaitHandle[], TimeSpan, Boolean) |
Espera que qualquer elemento do array especificado receba um sinal, usando a TimeSpan para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitAny(WaitHandle[], TimeSpan) |
Espera que qualquer um dos elementos do array especificado receba um sinal, usando a TimeSpan para especificar o intervalo de tempo. |
| WaitAny(WaitHandle[]) |
Espera que qualquer um dos elementos do array especificado receba um sinal. |
| WaitOne() |
Bloqueia a linha de corrente até que a corrente WaitHandle receba um sinal. |
| WaitOne(Int32, Boolean) |
Bloqueia o thread atual até que a corrente WaitHandle receba um sinal, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitOne(Int32) |
Bloqueia a thread da corrente até que a corrente WaitHandle receba um sinal, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo em milissegundos. |
| WaitOne(TimeSpan, Boolean) |
Bloqueia o thread atual até que a instância atual receba um sinal, usando a TimeSpan para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera. |
| WaitOne(TimeSpan) |
Bloqueia o thread atual até que a instância atual receba um sinal, usando a TimeSpan para especificar o intervalo de tempo. |
Implementações de Interface Explícita
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Esta API suporta a infraestrutura de produtos e não é pressuposta para ser utilizada diretamente a partir do seu código. Liberta todos os recursos utilizados pelo WaitHandle. |
Métodos da Extensão
| Name | Description |
|---|---|
| GetSafeWaitHandle(WaitHandle) |
Obtém o handle seguro para um handle de espera nativo do sistema operativo. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Define um handle seguro para um handle de espera nativo do sistema operativo. |
Aplica-se a
Segurança de Thread
Este tipo é seguro para fios.