Condividi tramite


WaitHandle Classe

Definizione

Incapsula oggetti specifici del sistema operativo che attendono l'accesso esclusivo alle risorse condivise.

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
Ereditarietà
WaitHandle
Ereditarietà
Derivato
Attributi
Implementazioni

Esempio

Nell'esempio di codice seguente viene illustrato come due thread possono eseguire attività in background mentre il thread Main attende il completamento delle attività usando i metodi e WaitAll statici WaitAny della 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).

Commenti

La WaitHandle classe incapsula un handle di sincronizzazione del sistema operativo nativo e viene usato per rappresentare tutti gli oggetti di sincronizzazione nel runtime che consentono più operazioni di attesa. Per un confronto degli handle di attesa con altri oggetti di sincronizzazione, vedere Panoramica delle primitive di sincronizzazione.

La WaitHandle classe stessa è astratta. Le classi derivate da WaitHandle definiscono un meccanismo di segnalazione per indicare l'acquisizione o il rilascio dell'accesso a una risorsa condivisa, ma usano i metodi ereditati WaitHandle per bloccare l'attesa dell'accesso alle risorse condivise. Le classi derivate da WaitHandle includono:

I thread possono bloccarsi in un singolo handle di attesa chiamando il metodo WaitOnedi istanza , ereditato dalle classi derivate da WaitHandle.

Le classi derivate di WaitHandle differiscono nell'affinità di thread. Gli handle di attesa degli eventi (EventWaitHandle, AutoResetEvente ) e ManualResetEventi semafori non hanno affinità di thread. Qualsiasi thread può segnalare un handle di attesa degli eventi o un semaforo. I mutex, d'altra parte, hanno affinità di thread; il thread proprietario di un mutex deve rilasciarlo e viene generata un'eccezione se un thread chiama il ReleaseMutex metodo su un mutex di cui non è proprietario.

Poiché la WaitHandle classe deriva da MarshalByRefObject, queste classi possono essere usate per sincronizzare le attività dei thread attraverso i limiti del dominio applicazione.

Oltre alle classi derivate, la WaitHandle classe dispone di diversi metodi statici che bloccano un thread fino a quando uno o più oggetti di sincronizzazione non ricevono un segnale. Questi includono:

  • SignalAndWait, che consente a un thread di segnalare un handle di attesa e attendere immediatamente su un altro.

  • WaitAll, che consente a un thread di attendere fino a quando tutti gli handle di attesa in una matrice ricevono un segnale.

  • WaitAny, che consente a un thread di attendere fino a quando non viene segnalato uno dei set di handle di attesa specificati.

Gli overload di questi metodi forniscono intervalli di timeout per abbandonare l'attesa e la possibilità di uscire da un contesto di sincronizzazione prima di immettere l'attesa, consentendo ad altri thread di usare il contesto di sincronizzazione.

Importante

Questo tipo implementa l'interfaccia IDisposable . Al termine dell'uso del tipo o di un tipo derivato da esso, è necessario eliminarlo direttamente o indirettamente. Per eliminare direttamente il tipo, chiamare il Close relativo metodo in un try/catch blocco. Per eliminarlo indirettamente, usare un costrutto del linguaggio, ad using esempio (in C#) o Using (in Visual Basic). Per altre informazioni, vedere la sezione "Uso di un oggetto che implementa IDisposable" nell'argomento relativo all'interfaccia IDisposable .

WaitHandle implementa il Dispose modello . Vedere Implementazione di un metodo Dispose. Quando si deriva da WaitHandle, usare la proprietà per archiviare l'handle SafeWaitHandle del sistema operativo nativo. Non è necessario eseguire l'override del metodo protetto Dispose a meno che non si usino risorse aggiuntive non gestite.

Costruttori

Nome Descrizione
WaitHandle()

Inizializza una nuova istanza della classe WaitHandle.

Campi

Nome Descrizione
InvalidHandle

Rappresenta un handle del sistema operativo nativo non valido. Il campo è di sola lettura.

WaitTimeout

Indica che si è verificato un timeout di un'operazione WaitAny(WaitHandle[], Int32, Boolean) prima che uno degli handle di attesa sia stato segnalato. Questo campo è costante.

Proprietà

Nome Descrizione
Handle
Obsoleti.
Obsoleti.

Ottiene o imposta l'handle nativo del sistema operativo.

SafeWaitHandle

Ottiene o imposta l'handle nativo del sistema operativo.

Metodi

Nome Descrizione
Close()

Rilascia tutte le risorse contenute nell'oggetto corrente WaitHandle.

CreateObjRef(Type)

Crea un oggetto che contiene tutte le informazioni pertinenti necessarie per generare un proxy utilizzato per comunicare con un oggetto remoto.

(Ereditato da MarshalByRefObject)
Dispose()

Rilascia tutte le risorse usate dall'istanza corrente della WaitHandle classe .

Dispose(Boolean)

In caso di override in una classe derivata, rilascia le risorse non gestite usate da WaitHandlee, facoltativamente, rilascia le risorse gestite.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
Finalize()

Rilascia le risorse contenute nell'istanza corrente.

GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetLifetimeService()
Obsoleti.

Recupera l'oggetto servizio di durata corrente che controlla i criteri di durata per questa istanza.

(Ereditato da MarshalByRefObject)
GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
InitializeLifetimeService()
Obsoleti.

Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza.

(Ereditato da MarshalByRefObject)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
MemberwiseClone(Boolean)

Crea una copia superficiale dell'oggetto corrente MarshalByRefObject .

(Ereditato da MarshalByRefObject)
SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

Segnala uno WaitHandle e attende un altro, specificando un intervallo di timeout come intero con segno a 32 bit e specificando se uscire dal dominio di sincronizzazione per il contesto prima di immettere l'attesa.

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

Segnala uno WaitHandle e attende su un altro, specificando l'intervallo di timeout come e TimeSpan specificando se uscire dal dominio di sincronizzazione per il contesto prima di immettere l'attesa.

SignalAndWait(WaitHandle, WaitHandle)

Segnala una WaitHandle e attende un'altra.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)
WaitAll(WaitHandle[], Int32, Boolean)

Attende che tutti gli elementi nella matrice specificata ricevano un segnale, usando un Int32 valore per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitAll(WaitHandle[], Int32)

Attende che tutti gli elementi nella matrice specificata ricevano un segnale, usando un Int32 valore per specificare l'intervallo di tempo.

WaitAll(WaitHandle[], TimeSpan, Boolean)

Attende che tutti gli elementi nella matrice specificata ricevano un segnale, usando un TimeSpan valore per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitAll(WaitHandle[], TimeSpan)

Attende che tutti gli elementi nella matrice specificata ricevano un segnale, usando un TimeSpan valore per specificare l'intervallo di tempo.

WaitAll(WaitHandle[])

Attende che tutti gli elementi nella matrice specificata ricevano un segnale.

WaitAny(WaitHandle[], Int32, Boolean)

Attende che uno degli elementi nella matrice specificata riceva un segnale, utilizzando un intero con segno a 32 bit per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitAny(WaitHandle[], Int32)

Attende che uno degli elementi nella matrice specificata riceva un segnale, utilizzando un intero con segno a 32 bit per specificare l'intervallo di tempo.

WaitAny(WaitHandle[], TimeSpan, Boolean)

Attende che uno degli elementi nella matrice specificata riceva un segnale, utilizzando un TimeSpan oggetto per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitAny(WaitHandle[], TimeSpan)

Attende che uno degli elementi nella matrice specificata riceva un segnale, utilizzando un TimeSpan oggetto per specificare l'intervallo di tempo.

WaitAny(WaitHandle[])

Attende che uno degli elementi nella matrice specificata riceva un segnale.

WaitOne()

Blocca il thread corrente fino a quando l'oggetto corrente WaitHandle non riceve un segnale.

WaitOne(Int32, Boolean)

Blocca il thread corrente fino a quando l'oggetto corrente WaitHandle non riceve un segnale, utilizzando un intero con segno a 32 bit per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitOne(Int32)

Blocca il thread corrente fino a quando l'oggetto corrente WaitHandle non riceve un segnale, usando un intero con segno a 32 bit per specificare l'intervallo di tempo in millisecondi.

WaitOne(TimeSpan, Boolean)

Blocca il thread corrente fino a quando l'istanza corrente non riceve un segnale, utilizzando un TimeSpan oggetto per specificare l'intervallo di tempo e specificando se uscire dal dominio di sincronizzazione prima dell'attesa.

WaitOne(TimeSpan)

Blocca il thread corrente fino a quando l'istanza corrente non riceve un segnale, usando un TimeSpan oggetto per specificare l'intervallo di tempo.

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IDisposable.Dispose()

Questa API supporta l'infrastruttura del prodotto e non è previsto che venga usata direttamente dal codice.

Rilascia tutte le risorse usate da WaitHandle.

Metodi di estensione

Nome Descrizione
GetSafeWaitHandle(WaitHandle)

Ottiene l'handle sicuro per un handle di attesa del sistema operativo nativo.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Imposta un handle sicuro per un handle di attesa del sistema operativo nativo.

Si applica a

Thread safety

Questo tipo è thread-safe.

Vedi anche