WaitHandle Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Besturingssysteemspecifieke objecten inkapselen die wachten op exclusieve toegang tot gedeelde resources.
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
- Overname
-
WaitHandle
- Overname
- Afgeleid
- Kenmerken
- Implementeringen
Voorbeelden
In het volgende codevoorbeeld ziet u hoe twee threads achtergrondtaken kunnen uitvoeren terwijl de hoofdthread wacht totdat de taken zijn voltooid met behulp van de statische WaitAny methoden WaitAll van de WaitHandle klasse.
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).
Opmerkingen
De WaitHandle klasse bevat een systeemeigen greep voor besturingssysteemsynchronisatie en wordt gebruikt om alle synchronisatieobjecten in de runtime weer te geven die meerdere wachtbewerkingen toestaan. Zie Overzicht van synchronisatieprimitief voor een vergelijking van wachtgrepen met andere synchronisatieobjecten.
De WaitHandle klasse zelf is abstract. Klassen die zijn afgeleid van het definiëren van WaitHandle een signaleringsmechanisme om de toegang tot een gedeelde resource aan te geven of vrij te geven, maar ze gebruiken de overgenomen WaitHandle methoden om te blokkeren terwijl wordt gewacht op toegang tot gedeelde resources. De klassen die zijn afgeleid van WaitHandle :
De EventWaitHandle klasse en de afgeleide klassen, AutoResetEvent en ManualResetEvent.
De Semaphore klas. Zie Semaphore en SemaphoreSlim.
Threads kunnen blokkeren voor een afzonderlijke wachtgreep door de instantiemethode WaitOneaan te roepen, die wordt overgenomen door klassen die zijn afgeleid van WaitHandle.
De afgeleide klassen verschillen WaitHandle in hun threadaffiniteit. Gebeurteniswachtingangen (EventWaitHandle, AutoResetEventen ) en ManualResetEventsemaforen hebben geen threadaffiniteit. Elke thread kan een wachtgreep of semafore van een gebeurtenis signaleren. Mutexes hebben daarentegen wel threadaffiniteit; de thread die eigenaar is van een mutex, moet deze vrijgeven en er wordt een uitzondering gegenereerd als een thread de ReleaseMutex methode aanroept op een mutex die deze niet bezit.
Omdat de WaitHandle klasse is afgeleid van MarshalByRefObject, kunnen deze klassen worden gebruikt om de activiteiten van threads over de grenzen van het toepassingsdomein te synchroniseren.
Naast de afgeleide klassen heeft de WaitHandle klasse een aantal statische methoden die een thread blokkeren totdat een of meer synchronisatieobjecten een signaal ontvangen. Deze omvatten:
SignalAndWait, waarmee een thread één wachtgreep kan signaleren en onmiddellijk op een andere wachtgreep kan wachten.
WaitAll, waarmee een thread kan wachten totdat alle wachtgrepen in een matrix een signaal ontvangen.
WaitAny, waarmee een thread kan wachten tot een van een van een opgegeven set wachtgrepen is gesignaleerd.
De overbelasting van deze methoden biedt time-outintervallen voor het afbreken van de wachttijd en de mogelijkheid om een synchronisatiecontext af te sluiten voordat u de wacht invoert, zodat andere threads de synchronisatiecontext kunnen gebruiken.
Important
Met dit type wordt de IDisposable interface geïmplementeerd. Wanneer u klaar bent met het gebruik van het type of een type dat ervan is afgeleid, moet u het rechtstreeks of indirect verwijderen. Als u het type rechtstreeks wilt verwijderen, roept u de Close methode aan in een try/catch blok. Als u deze indirect wilt verwijderen, gebruikt u een taalconstructie zoals using (in C#) of Using (in Visual Basic). Zie de sectie 'Using an Object that Implements IDisposable' (Een object gebruiken dat IDisposable implementeert) in het IDisposable interfaceonderwerp voor meer informatie.
WaitHandle implementeert het Dispose patroon. Zie De implementatie van een verwijderingsmethode. Wanneer u afgeleid bent van WaitHandle, gebruikt u de eigenschap om de SafeWaitHandle systeemeigen ingang van het besturingssysteem op te slaan. U hoeft de beveiligde Dispose methode niet te overschrijven, tenzij u aanvullende onbeheerde resources gebruikt.
Constructors
| Name | Description |
|---|---|
| WaitHandle() |
Initialiseert een nieuw exemplaar van de WaitHandle klasse. |
Velden
| Name | Description |
|---|---|
| InvalidHandle |
Vertegenwoordigt een ongeldige systeemeigen ingang van het besturingssysteem. Dit veld is alleen-lezen. |
| WaitTimeout |
Geeft aan dat er een time-out optreedt voordat een WaitAny(WaitHandle[], Int32, Boolean) van de wachtgrepen is gesignaleerd. Dit veld is constant. |
Eigenschappen
| Name | Description |
|---|---|
| Handle |
Verouderd.
Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in. |
| SafeWaitHandle |
Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in. |
Methoden
| Name | Description |
|---|---|
| Close() |
Alle resources die door de huidige WaitHandleresources worden bewaard, worden vrijgegeven. |
| CreateObjRef(Type) |
Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object. (Overgenomen van MarshalByRefObject) |
| Dispose() |
Alle resources die door het huidige exemplaar van de WaitHandle klasse worden gebruikt, worden vrijgegeven. |
| Dispose(Boolean) |
Wanneer deze worden overschreven in een afgeleide klasse, worden de onbeheerde resources die door de WaitHandleklasse worden gebruikt, uitgebracht en worden de beheerde resources optioneel vrijgegeven. |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| Finalize() |
Releases van de resources die worden bewaard door het huidige exemplaar. |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetLifetimeService() |
Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd. (Overgenomen van MarshalByRefObject) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| InitializeLifetimeService() |
Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren. (Overgenomen van MarshalByRefObject) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| MemberwiseClone(Boolean) |
Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object. (Overgenomen van MarshalByRefObject) |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
WaitHandle Signaleert een en wacht op een ander, waarbij een time-outinterval wordt opgegeven als een 32-bits geheel getal dat is ondertekend en wordt opgegeven of het synchronisatiedomein voor de context moet worden afgesloten voordat de wacht wordt ingevoerd. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
WaitHandle Signalen een en wachten op een andere, waarbij het time-outinterval wordt opgegeven als een TimeSpan en opgeven of het synchronisatiedomein voor de context moet worden afgesloten voordat u de wacht invoert. |
| SignalAndWait(WaitHandle, WaitHandle) |
Signaleert de WaitHandle ene en wacht op een andere. |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
| WaitAll(WaitHandle[], Int32, Boolean) |
Wacht tot alle elementen in de opgegeven matrix een signaal ontvangen, met behulp van een Int32 waarde om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wachttijd wordt uitgevoerd. |
| WaitAll(WaitHandle[], Int32) |
Wacht tot alle elementen in de opgegeven matrix een signaal ontvangen, met behulp van een Int32 waarde om het tijdsinterval op te geven. |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Wacht tot alle elementen in de opgegeven matrix een signaal ontvangen, met behulp van een TimeSpan waarde om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wachttijd wordt uitgevoerd. |
| WaitAll(WaitHandle[], TimeSpan) |
Wacht tot alle elementen in de opgegeven matrix een signaal ontvangen, met behulp van een TimeSpan waarde om het tijdsinterval op te geven. |
| WaitAll(WaitHandle[]) |
Wacht tot alle elementen in de opgegeven matrix een signaal ontvangen. |
| WaitAny(WaitHandle[], Int32, Boolean) |
Wacht tot een van de elementen in de opgegeven matrix een signaal ontvangt, met behulp van een 32-bits geheel getal dat is ondertekend om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd. |
| WaitAny(WaitHandle[], Int32) |
Wacht tot een van de elementen in de opgegeven matrix een signaal ontvangt met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval op te geven. |
| WaitAny(WaitHandle[], TimeSpan, Boolean) |
Wacht tot een van de elementen in de opgegeven matrix een signaal ontvangt, met behulp van een TimeSpan om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wachttijd wordt uitgevoerd. |
| WaitAny(WaitHandle[], TimeSpan) |
Wacht tot een van de elementen in de opgegeven matrix een signaal ontvangt, met behulp van een TimeSpan om het tijdsinterval op te geven. |
| WaitAny(WaitHandle[]) |
Wacht tot een van de elementen in de opgegeven matrix een signaal ontvangt. |
| WaitOne() |
Hiermee blokkeert u de huidige thread totdat de stroom WaitHandle een signaal ontvangt. |
| WaitOne(Int32, Boolean) |
Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd. |
| WaitOne(Int32) |
Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval in milliseconden op te geven. |
| WaitOne(TimeSpan, Boolean) |
Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt, met behulp van een TimeSpan om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd. |
| WaitOne(TimeSpan) |
Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt met behulp van een TimeSpan signaal om het tijdsinterval op te geven. |
Expliciete interface-implementaties
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Deze API ondersteunt de productinfrastructuur en is niet bedoeld om rechtstreeks vanuit de code te gebruiken. Alle resources die worden gebruikt door de WaitHandle. |
Extensiemethoden
| Name | Description |
|---|---|
| GetSafeWaitHandle(WaitHandle) |
Hiermee haalt u de veilige ingang voor een systeemeigen wachtgreep van het besturingssysteem op. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Hiermee stelt u een veilige ingang in voor een systeemeigen wachtgreep voor het besturingssysteem. |
Van toepassing op
Veiligheid thread
Dit type is thread veilig.