WaitHandle Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Kapselt betriebssystemspezifische Objekte, die auf exklusiven Zugriff auf freigegebene Ressourcen warten.
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
- Vererbung
-
WaitHandle
- Vererbung
- Abgeleitet
- Attribute
- Implementiert
Beispiele
Das folgende Codebeispiel zeigt, wie zwei Threads Hintergrundaufgaben ausführen können, während der Hauptthread wartet, bis die Aufgaben mithilfe der statischen WaitAny und WaitAll Methoden der WaitHandle Klasse abgeschlossen werden.
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).
Hinweise
Die WaitHandle Klasse kapselt ein systemeigenes Synchronisierungshandle des Betriebssystems und wird verwendet, um alle Synchronisierungsobjekte in der Laufzeit darzustellen, die mehrere Wartevorgänge zulassen. Einen Vergleich von Wartehandles mit anderen Synchronisierungsobjekten finden Sie unter Übersicht über Synchronisierungsgrundtypen.
Die WaitHandle Klasse selbst ist abstrakt. Klassen, die von WaitHandle der Definition eines Signalmechanismus abgeleitet wurden, um anzugeben, dass sie zugriff auf eine freigegebene Ressource nehmen oder freigeben, aber sie verwenden die geerbten Methoden, um zu blockieren, während sie auf den Zugriff auf freigegebene WaitHandle Ressourcen warten. Die von WaitHandle folgenden Klassen abgeleiteten Klassen:
Die EventWaitHandle Klasse und die abgeleiteten Klassen AutoResetEvent und ManualResetEvent.
Die Semaphore Klasse. Siehe Semaphor und SemaphorESlim.
Threads können für ein einzelnes Wait Handle blockieren, indem die Instanzmethode WaitOneaufgerufen wird, die von Klassen geerbt wird, die von WaitHandleabgeleiteten Klassen geerbt werden.
Die abgeleiteten Klassen unterscheiden WaitHandle sich in ihrer Threadaffinität. Ereigniswartehandles (EventWaitHandle, AutoResetEventund ) und ManualResetEventSemaphoren haben keine Threadaffinität. Jeder Thread kann ein Ereigniswartehandle oder Semaphor signalisieren. Mutexes hingegen haben Threadaffinität; der Thread, der ein Mutex besitzt, muss es freigeben, und eine Ausnahme wird ausgelöst, wenn ein Thread die ReleaseMutex Methode für einen Mutex aufruft, den er nicht besitzt.
Da die WaitHandle Klasse von MarshalByRefObjectdiesen Klassen abgeleitet ist, können diese Klassen verwendet werden, um die Aktivitäten von Threads über Anwendungsdomänengrenzen hinweg zu synchronisieren.
Zusätzlich zu den abgeleiteten Klassen verfügt die WaitHandle Klasse über eine Reihe statischer Methoden, die einen Thread blockieren, bis mindestens ein Synchronisierungsobjekt ein Signal empfängt. Dazu zählen:
SignalAndWait, wodurch ein Thread einen Wartepunkt signalisiert und sofort auf einen anderen wartet.
WaitAll, wodurch ein Thread warten kann, bis alle Warteziehpunkte in einem Array ein Signal empfangen.
WaitAny, wodurch ein Thread warten kann, bis eine der angegebenen Warteziehpunkte signalisiert wurde.
Die Überladungen dieser Methoden bieten Zeitüberschreitungsintervalle für das Beenden der Wartezeit und die Möglichkeit, einen Synchronisierungskontext zu beenden, bevor Sie die Wartezeit eingeben, sodass andere Threads den Synchronisierungskontext verwenden können.
Von Bedeutung
Dieser Typ implementiert die IDisposable Schnittstelle. Wenn Sie mit der Verwendung des Typs oder eines daraus abgeleiteten Typs fertig sind, sollten Sie ihn entweder direkt oder indirekt verwerfen. Rufen Sie die Methode Close in einem try/catch-Block auf, um den Typ direkt zu entsorgen. Verwenden Sie zum indirekten Löschen ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt "Verwenden eines Objekts, das IDisposable implementiert" im IDisposable Schnittstellenthema.
WaitHandle implementiert das Dispose Muster. Siehe Implementieren einer Dispose-Methode. Wenn Sie von WaitHandledieser abgeleitet werden, verwenden Sie die SafeWaitHandle Eigenschaft, um das systemeigene Betriebssystemhandle zu speichern. Sie müssen die geschützte Dispose Methode nicht außer Kraft setzen, es sei denn, Sie verwenden zusätzliche nicht verwaltete Ressourcen.
Konstruktoren
| Name | Beschreibung |
|---|---|
| WaitHandle() |
Initialisiert eine neue Instanz der WaitHandle-Klasse. |
Felder
| Name | Beschreibung |
|---|---|
| InvalidHandle |
Stellt ein ungültiges systemeigenes Betriebssystemhandle dar. Dieses Feld ist schreibgeschützt. |
| WaitTimeout |
Gibt an, dass ein WaitAny(WaitHandle[], Int32, Boolean) Vorgang überschritten wurde, bevor ein Wartepunkt signalisiert wurde. Dieses Feld ist konstant. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Handle |
Veraltet.
Veraltet.
Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles. |
| SafeWaitHandle |
Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles. |
Methoden
| Name | Beschreibung |
|---|---|
| Close() |
Veröffentlicht alle Ressourcen, die von der aktuellen WaitHandle. |
| CreateObjRef(Type) |
Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird. (Geerbt von MarshalByRefObject) |
| Dispose() |
Gibt alle Ressourcen frei, die von der aktuellen Instanz der WaitHandle Klasse verwendet werden. |
| Dispose(Boolean) |
Wenn sie in einer abgeleiteten Klasse überschrieben werden, werden die nicht verwalteten Ressourcen freigegeben, die von den WaitHandleverwalteten Ressourcen verwendet werden, und optional die verwalteten Ressourcen freigegeben. |
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| Finalize() |
Gibt die Ressourcen frei, die von der aktuellen Instanz gehalten werden. |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetLifetimeService() |
Veraltet.
Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert. (Geerbt von MarshalByRefObject) |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| InitializeLifetimeService() |
Veraltet.
Ruft ein Lebensdauerdienstobjekt ab, um die Lebensdauerrichtlinie für diese Instanz zu steuern. (Geerbt von MarshalByRefObject) |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| MemberwiseClone(Boolean) |
Erstellt eine flache Kopie des aktuellen MarshalByRefObject Objekts. (Geerbt von MarshalByRefObject) |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
Signalisiert eins WaitHandle und wartet auf eine andere, und gibt ein Timeoutintervall als 32-Bit-Ganzzahl mit Vorzeichen an und gibt an, ob die Synchronisierungsdomäne für den Kontext beendet werden soll, bevor Sie die Wartezeit eingeben. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
Signalisiert einen WaitHandle und wartet auf einen anderen, und gibt das Timeoutintervall als ein TimeSpan und gibt an, ob die Synchronisierungsdomäne für den Kontext beendet werden soll, bevor Sie die Wartezeit eingeben. |
| SignalAndWait(WaitHandle, WaitHandle) |
Signalisiert einen WaitHandle und wartet auf eine andere. |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
| WaitAll(WaitHandle[], Int32, Boolean) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitAll(WaitHandle[], Int32) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben. |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben, und gibt an, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitAll(WaitHandle[], TimeSpan) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben. |
| WaitAll(WaitHandle[]) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen. |
| WaitAny(WaitHandle[], Int32, Boolean) |
Wartet auf eines der Elemente im angegebenen Array, um ein Signal zu empfangen, wobei eine 32-Bit-ganzzahlige Vorzeichen verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor dem Warten beendet werden soll. |
| WaitAny(WaitHandle[], Int32) |
Wartet auf eines der Elemente im angegebenen Array, um ein Signal zu empfangen, wobei eine 32-Bit-ganzzahlige Vorzeichen verwendet wird, um das Zeitintervall anzugeben. |
| WaitAny(WaitHandle[], TimeSpan, Boolean) |
Wartet auf eines der Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Zeitintervall angegeben und angegeben wird, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitAny(WaitHandle[], TimeSpan) |
Wartet auf eines der Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Zeitintervall angegeben wird. |
| WaitAny(WaitHandle[]) |
Wartet auf eines der Elemente im angegebenen Array, um ein Signal zu empfangen. |
| WaitOne() |
Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt. |
| WaitOne(Int32, Boolean) |
Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt, wobei eine 32-Bit-ganzzahl mit Vorzeichen verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor dem Warten beendet werden soll. |
| WaitOne(Int32) |
Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt, wobei eine 32-Bit-ganzzahl mit Vorzeichen verwendet wird, um das Zeitintervall in Millisekunden anzugeben. |
| WaitOne(TimeSpan, Boolean) |
Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei ein TimeSpan Zeitintervall angegeben und angegeben wird, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitOne(TimeSpan) |
Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei ein TimeSpan Zeitintervall angegeben wird. |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| IDisposable.Dispose() |
Diese API unterstützt die Produktinfrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code gedacht. Veröffentlicht alle ressourcen, die von der WaitHandle. |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| GetSafeWaitHandle(WaitHandle) |
Ruft das sichere Handle für ein systemeigenes Betriebssystem-Wait Handle ab. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Legt einen sicheren Handle für ein systemeigenes Betriebssystem-Wait Handle fest. |
Gilt für:
Threadsicherheit
Dieser Typ ist threadsicher.