AutoResetEvent 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.
Stellt ein Threadsynchronisierungsereignis dar, das, wenn signalisiert, einen einzelnen Wartethread loslässt und dann automatisch zurückgesetzt wird. Diese Klasse kann nicht geerbt werden.
public ref class AutoResetEvent sealed : System::Threading::EventWaitHandle
public ref class AutoResetEvent sealed : System::Threading::WaitHandle
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
public sealed class AutoResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
type AutoResetEvent = class
inherit EventWaitHandle
type AutoResetEvent = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type AutoResetEvent = class
inherit EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits WaitHandle
- Vererbung
- Vererbung
- Vererbung
- Attribute
Beispiele
Das folgende Beispiel zeigt, wie AutoResetEvent Sie jeweils einen Thread freigeben, indem sie die Set Methode (auf der Basisklasse) jedes Mal aufruft, wenn der Benutzer die EINGABETASTE drückt. Im Beispiel werden drei Threads gestartet, die auf ein AutoResetEvent Objekt warten, das im signalierten Zustand erstellt wurde. Der erste Thread wird sofort freigegeben, da sich der AutoResetEvent Signalzustand bereits befindet. Dadurch wird der AutoResetEvent nicht signalgesteuerte Zustand zurückgesetzt, sodass nachfolgende Threads blockiert werden. Die blockierten Threads werden erst freigegeben, wenn der Benutzer sie einzeln loslässt, indem er die EINGABETASTE drückt.
Nachdem die Threads vom ersten AutoResetEventfreigegeben wurden, warten sie auf eine andere AutoResetEvent , die im nicht signalgesteuerten Zustand erstellt wurde. Alle drei Threads blockieren, sodass die Set Methode dreimal aufgerufen werden muss, um sie alle freizugeben.
using System;
using System.Threading;
// Visual Studio: Replace the default class in a Console project with
// the following class.
class Example
{
private static AutoResetEvent event_1 = new AutoResetEvent(true);
private static AutoResetEvent event_2 = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Press Enter to create three threads and start them.\r\n" +
"The threads wait on AutoResetEvent #1, which was created\r\n" +
"in the signaled state, so the first thread is released.\r\n" +
"This puts AutoResetEvent #1 into the unsignaled state.");
Console.ReadLine();
for (int i = 1; i < 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(250);
for (int i = 0; i < 2; i++)
{
Console.WriteLine("Press Enter to release another thread.");
Console.ReadLine();
event_1.Set();
Thread.Sleep(250);
}
Console.WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Press Enter to release a thread.");
Console.ReadLine();
event_2.Set();
Thread.Sleep(250);
}
// Visual Studio: Uncomment the following line.
//Console.Readline();
}
static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine("{0} waits on AutoResetEvent #1.", name);
event_1.WaitOne();
Console.WriteLine("{0} is released from AutoResetEvent #1.", name);
Console.WriteLine("{0} waits on AutoResetEvent #2.", name);
event_2.WaitOne();
Console.WriteLine("{0} is released from AutoResetEvent #2.", name);
Console.WriteLine("{0} ends.", name);
}
}
/* This example produces output similar to the following:
Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.
Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.
Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.
Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.
All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.
Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.
Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.
Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
*/
Imports System.Threading
' Visual Studio: Replace the default class in a Console project with
' the following class.
Class Example
Private Shared event_1 As New AutoResetEvent(True)
Private Shared event_2 As New AutoResetEvent(False)
<MTAThread()> _
Shared Sub Main()
Console.WriteLine("Press Enter to create three threads and start them." & vbCrLf & _
"The threads wait on AutoResetEvent #1, which was created" & vbCrLf & _
"in the signaled state, so the first thread is released." & vbCrLf & _
"This puts AutoResetEvent #1 into the unsignaled state.")
Console.ReadLine()
For i As Integer = 1 To 3
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next
Thread.Sleep(250)
For i As Integer = 1 To 2
Console.WriteLine("Press Enter to release another thread.")
Console.ReadLine()
event_1.Set()
Thread.Sleep(250)
Next
Console.WriteLine(vbCrLf & "All threads are now waiting on AutoResetEvent #2.")
For i As Integer = 1 To 3
Console.WriteLine("Press Enter to release a thread.")
Console.ReadLine()
event_2.Set()
Thread.Sleep(250)
Next
' Visual Studio: Uncomment the following line.
'Console.Readline()
End Sub
Shared Sub ThreadProc()
Dim name As String = Thread.CurrentThread.Name
Console.WriteLine("{0} waits on AutoResetEvent #1.", name)
event_1.WaitOne()
Console.WriteLine("{0} is released from AutoResetEvent #1.", name)
Console.WriteLine("{0} waits on AutoResetEvent #2.", name)
event_2.WaitOne()
Console.WriteLine("{0} is released from AutoResetEvent #2.", name)
Console.WriteLine("{0} ends.", name)
End Sub
End Class
' This example produces output similar to the following:
'
'Press Enter to create three threads and start them.
'The threads wait on AutoResetEvent #1, which was created
'in the signaled state, so the first thread is released.
'This puts AutoResetEvent #1 into the unsignaled state.
'
'Thread_1 waits on AutoResetEvent #1.
'Thread_1 is released from AutoResetEvent #1.
'Thread_1 waits on AutoResetEvent #2.
'Thread_3 waits on AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #1.
'Press Enter to release another thread.
'
'Thread_3 is released from AutoResetEvent #1.
'Thread_3 waits on AutoResetEvent #2.
'Press Enter to release another thread.
'
'Thread_2 is released from AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #2.
'
'All threads are now waiting on AutoResetEvent #2.
'Press Enter to release a thread.
'
'Thread_2 is released from AutoResetEvent #2.
'Thread_2 ends.
'Press Enter to release a thread.
'
'Thread_1 is released from AutoResetEvent #2.
'Thread_1 ends.
'Press Enter to release a thread.
'
'Thread_3 is released from AutoResetEvent #2.
'Thread_3 ends.
Hinweise
Sie verwenden AutoResetEvent, ManualResetEventund EventWaitHandle für Threadinteraktion (oder Threadsignalisierung). Weitere Informationen finden Sie unter Threadinteraktion.
Ein Thread wartet auf ein Signal, indem AutoResetEvent.WaitOne aufgerufen wird. Wenn sich der AutoResetEvent Zustand nicht signalisiert, blockiert der Thread, bis AutoResetEvent.Set aufgerufen wird. Aufrufen von Set Signalen AutoResetEvent , um einen Wartethread freizugeben.
AutoResetEvent bleibt so lange signalisiert, bis Reset ein einzelner Wartethread losgelassen wird, zu dem er automatisch zum nicht signalisierten Zustand zurückkehrt.
Wenn keine Threads warten, wenn der AutoResetEvent Zustand in einen signalisierten Zustand wechselt, bleibt der Zustand signalisiert, bis ein Thread das Signal beobachtet (durch Aufrufen WaitOne). Dieser Thread blockiert nicht: Der AutoResetEvent Thread gibt den Thread sofort frei und kehrt zum nicht signalisierten Zustand zurück.
Wichtig
Es gibt keine Garantie dafür, dass jeder Aufruf der Set Methode einen Thread freigibt. Wenn zwei Aufrufe zu nah zusammen sind, sodass der zweite Aufruf vor der Veröffentlichung eines Threads auftritt, wird nur ein Thread freigegeben. Es ist so, als ob der zweite Anruf nicht geschehen wäre. Wird auch aufgerufen, Set wenn keine Threads warten und das AutoResetEvent Signal bereits signalisiert wird, hat der Aufruf keine Auswirkung.
Sie können den Anfangszustand eines Werts AutoResetEvent steuern, indem Sie einen booleschen Wert an den Konstruktor übergeben: true wenn der Anfangszustand signalisiert wird und false andernfalls.
AutoResetEvent kann auch mit den staticWaitAll Und WaitAny Methoden verwendet werden.
AutoResetEvent wird von der EventWaitHandle Klasse abgeleitet. Ein AutoResetEvent funktional gleichwertiges Äquivalent zu einer EventWaitHandle erstellten mit EventResetMode.AutoReset.
Anmerkung
AutoResetEvent Im Gegensatz zur Klasse bietet die EventWaitHandle Klasse Zugriff auf benannte Systemsynchronisierungsereignisse.
Wichtig
Dieser Typ implementiert die IDisposable Schnittstelle. Wenn Sie die Verwendung des Typs abgeschlossen haben, sollten Sie ihn entweder direkt oder indirekt verwerfen. Rufen Sie die Methode Dispose 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" auf der IDisposable Schnittstellenseite.
Konstruktoren
| Name | Beschreibung |
|---|---|
| AutoResetEvent(Boolean) |
Initialisiert eine neue Instanz der AutoResetEvent Klasse mit einem booleschen Wert, der angibt, ob der Anfangszustand signalisiert werden soll. |
Felder
| Name | Beschreibung |
|---|---|
| WaitTimeout |
Gibt an, dass ein WaitAny(WaitHandle[], Int32, Boolean) Vorgang überschritten wurde, bevor ein Wartepunkt signalisiert wurde. Dieses Feld ist konstant. (Geerbt von WaitHandle) |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Handle |
Veraltet.
Veraltet.
Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles. (Geerbt von WaitHandle) |
| SafeWaitHandle |
Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles. (Geerbt von WaitHandle) |
Methoden
| Name | Beschreibung |
|---|---|
| Close() |
Veröffentlicht alle Ressourcen, die von der aktuellen WaitHandle. (Geerbt von 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. (Geerbt von WaitHandle) |
| 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. (Geerbt von WaitHandle) |
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| GetAccessControl() |
Ruft ein EventWaitHandleSecurity Objekt ab, das die Zugriffssteuerungssicherheit für das benannte Systemereignis darstellt, das durch das aktuelle EventWaitHandle Objekt dargestellt wird. (Geerbt von EventWaitHandle) |
| 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) |
| Reset() |
Legt den Status des Ereignisses auf "nicht signaliert" fest, wodurch Threads blockiert werden. |
| Reset() |
Legt den Status des Ereignisses auf "nicht signaliert" fest, wodurch Threads blockiert werden. (Geerbt von EventWaitHandle) |
| Set() |
Legt den Status des Ereignisses auf signalisiert fest, wodurch es höchstens einem Wartethread ermöglicht, den Vorgang fortzusetzen. |
| Set() |
Legt den Status des Ereignisses fest, das signalisiert wird, sodass ein oder mehrere Wartethreads fortgesetzt werden können. (Geerbt von EventWaitHandle) |
| SetAccessControl(EventWaitHandleSecurity) |
Legt die Zugriffssteuerungssicherheit für ein benanntes Systemereignis fest. (Geerbt von EventWaitHandle) |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
| WaitOne() |
Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt. (Geerbt von WaitHandle) |
| 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. (Geerbt von WaitHandle) |
| 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. (Geerbt von WaitHandle) |
| 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. (Geerbt von WaitHandle) |
| WaitOne(TimeSpan) |
Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei ein TimeSpan Zeitintervall angegeben wird. (Geerbt von WaitHandle) |
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. (Geerbt von WaitHandle) |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| GetAccessControl(EventWaitHandle) |
Gibt die Sicherheitsbeschreibungen für den angegebenen |
| GetSafeWaitHandle(WaitHandle) |
Ruft das sichere Handle für ein systemeigenes Betriebssystem-Wait Handle ab. |
| SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Legt die Sicherheitsdeskriptoren für das angegebene Ereigniswartehandle fest. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Legt einen sicheren Handle für ein systemeigenes Betriebssystem-Wait Handle fest. |
Gilt für:
Threadsicherheit
Diese Klasse ist threadsicher.