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 bei Signalisierung einen einzelnen wartenden Thread freigibt und dann automatisch zurückgesetzt wird. Diese Klasse kann nicht vererbt 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 sie verwenden AutoResetEvent , um jeweils einen Thread freizugeben, indem die Set -Methode (in der Basisklasse) jedes Mal aufgerufen wird, wenn der Benutzer die EINGABETASTE drückt. Im Beispiel werden drei Threads gestartet, die auf eine AutoResetEvent warten, die im signalierten Zustand erstellt wurde. Der erste Thread wird sofort freigegeben, da sich der AutoResetEvent bereits im signalierten Zustand befindet. Dadurch wird der AutoResetEvent auf den nicht signalierten Zustand zurückgesetzt, sodass nachfolgende Threads blockiert werden. Die blockierten Threads werden erst freigegeben, wenn der Benutzer sie einzeln durch Drücken der EINGABETASTE freigibt.
Nachdem die Threads vom ersten AutoResetEventfreigegeben wurden, warten sie auf einen anderen AutoResetEvent , der im nicht signalierten Zustand erstellt wurde. Alle drei Threads blockieren, sodass die Set Methode dreimal aufgerufen werden muss, um sie alle freizugeben.
using namespace System;
using namespace System::Threading;
ref class Example
{
private:
static AutoResetEvent^ event_1 = gcnew AutoResetEvent(true);
static AutoResetEvent^ event_2 = gcnew AutoResetEvent(false);
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);
}
public:
static void Demo()
{
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 = gcnew Thread(gcnew ThreadStart(&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();
}
};
void main()
{
Example::Demo();
}
/* 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.
*/
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 die Threadinteraktion (oder Threadsignalisierung). Weitere Informationen finden Sie unter Threadinteraktion.
Ein Thread wartet auf ein Signal, indem AutoResetEvent.WaitOne aufgerufen wird. Wenn sich der AutoResetEvent
im nicht signalgeschützten Zustand befindet, blockiert der Thread, bis AutoResetEvent.Set aufgerufen wird. Aufrufsignale Set
AutoResetEvent
zum Freigeben eines wartenden Threads. AutoResetEvent
bleibt signalisiert, bis Reset
ein einzelner wartenden Thread aufgerufen oder freigegeben wird, und zu diesem Zeitpunkt kehrt er automatisch in den nicht signalierten Zustand zurück.
Wenn keine Threads warten, wenn der AutoResetEvent
in einen signalierten Zustand versetzt wird, bleibt der Zustand signalisiert, bis ein Thread das Signal beobachtet (durch Aufrufen WaitOnevon ). Dieser Thread blockiert nicht: Der AutoResetEvent gibt den Thread sofort frei und kehrt in den nicht signalierten Zustand zurück.
Wichtig
Es gibt keine Garantie, dass bei jedem Aufruf der Set -Methode ein Thread freigegeben wird. Wenn zwei Aufrufe zu eng beieinander liegen, sodass der zweite Aufruf vor der Freigabe eines Threads erfolgt, wird nur ein Thread freigegeben. Es ist, als ob der zweite Aufruf nicht erfolgt wäre. Auch wenn Set aufgerufen wird, wenn keine Threads warten und der AutoResetEvent bereits signalisiert ist, hat der Aufruf keine Auswirkung.
Sie können den Anfangszustand eines 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 static
WaitAll Methoden und WaitAny verwendet werden.
AutoResetEvent wird von der EventWaitHandle -Klasse abgeleitet. Ein AutoResetEvent entspricht funktional einem EventWaitHandle mit EventResetMode.AutoReseterstellten .
Hinweis
AutoResetEvent Im Gegensatz zur -Klasse bietet die EventWaitHandle -Klasse Zugriff auf benannte Systemsynchronisierungsereignisse.
Wichtig
Dieser Typ implementiert die IDisposable-Schnittstelle. Nach Abschluss der Verwendung sollten Sie den Typ entweder direkt oder indirekt löschen. Zum direkten Löschen des Typs rufen Sie seine Dispose-Methode in einem try
/catch
-Block auf. Zum indirekten Löschen verwenden Sie 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
AutoResetEvent(Boolean) |
Initialisiert eine neue Instanz der AutoResetEvent-Klasse mit einem booleschen Wert, der angibt, ob der anfängliche Zustand auf signalisiert festgelegt werden soll. |
Felder
WaitTimeout |
Gibt an, dass ein Timeout für einen WaitAny(WaitHandle[], Int32, Boolean)-Vorgang überschritten wurde, bevor ein Signal an eines der WaitHandles gesendet wurde. Dieses Feld ist konstant. (Geerbt von WaitHandle) |
Eigenschaften
Handle |
Veraltet.
Veraltet.
Ruft das systemeigene Betriebssystemhandle auf oder legt dieses fest. (Geerbt von WaitHandle) |
SafeWaitHandle |
Ruft das systemeigene Betriebssystemhandle auf oder legt dieses fest. (Geerbt von WaitHandle) |
Methoden
Close() |
Gibt alle von der aktuellen WaitHandle-Klasse reservierten Ressourcen frei. (Geerbt von WaitHandle) |
CreateObjRef(Type) |
Erstellt ein Objekt mit allen relevanten Informationen, die zum Generieren eines Proxys für die Kommunikation mit einem Remoteobjekt erforderlich sind. (Geerbt von MarshalByRefObject) |
Dispose() |
Gibt alle von der aktuellen Instanz der WaitHandle-Klasse verwendeten Ressourcen frei. (Geerbt von WaitHandle) |
Dispose(Boolean) |
Gibt beim Überschreiben in einer abgeleiteten Klasse die von WaitHandle verwendeten nicht verwalteten Ressourcen und optional die verwalteten Ressourcen frei. (Geerbt von WaitHandle) |
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (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() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetLifetimeService() |
Veraltet.
Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinien für diese Instanz steuert. (Geerbt von MarshalByRefObject) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
InitializeLifetimeService() |
Veraltet.
Ruft ein Lebensdauerdienstobjekt zur Steuerung der Lebensdauerrichtlinie für diese Instanz ab. (Geerbt von MarshalByRefObject) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
MemberwiseClone(Boolean) |
Erstellt eine flache Kopie des aktuellen MarshalByRefObject-Objekts. (Geerbt von MarshalByRefObject) |
Reset() |
Legt den Zustand des Ereignisses auf „nicht signalisiert“ fest, sodass Threads blockiert werden. |
Reset() |
Legt den Zustand des Ereignisses auf nicht signalisiert fest, sodass Threads blockiert werden. (Geerbt von EventWaitHandle) |
Set() |
Legt den Zustand des Ereignisses auf „signalisiert“ fest und ermöglicht so mindestens einem wartenden Thread das Fortfahren. |
Set() |
Legt den Zustand des Ereignisses auf signalisiert fest und ermöglicht so einem oder mehreren wartenden Threads fortzufahren. (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 das aktuelle WaitHandle ein Signal empfängt. (Geerbt von WaitHandle) |
WaitOne(Int32) |
Blockiert den aktuellen Thread, bis das aktuelle WaitHandle ein Signal empfängt, wobei eine 32-Bit-Ganzzahl mit Vorzeichen zum Angeben des Zeitintervalls in Millisekunden verwendet wird. (Geerbt von WaitHandle) |
WaitOne(Int32, Boolean) |
Blockiert den aktuellen Thread, bis das aktuelle WaitHandle ein Signal empfängt, wobei eine 32-Bit-Ganzzahl mit Vorzeichen zum Angeben des Zeitintervalls verwendet und angegeben wird, ob die Synchronisierungsdomäne vor dem Wartevorgang verlassen werden soll. (Geerbt von WaitHandle) |
WaitOne(TimeSpan) |
Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei eine TimeSpan zum Angeben des Zeitintervalls verwendet wird. (Geerbt von WaitHandle) |
WaitOne(TimeSpan, Boolean) |
Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei eine TimeSpan zum Angeben des Zeitintervalls verwendet und angegeben wird, ob die Synchronisierungsdomäne vor dem Wartevorgang verlassen werden soll. (Geerbt von WaitHandle) |
Explizite Schnittstellenimplementierungen
IDisposable.Dispose() |
Diese API unterstützt die Produktinfrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code gedacht. Gibt alle vom WaitHandle verwendeten Ressourcen frei. (Geerbt von WaitHandle) |
Erweiterungsmethoden
GetAccessControl(EventWaitHandle) |
Gibt die Sicherheitsbeschreibungen für den angegebenen |
SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Legt die Sicherheitsbeschreibungen für das angegebene Ereigniswartehandle fest. |
GetSafeWaitHandle(WaitHandle) |
Ruft das sichere Handle für ein systemeigenes Betriebssystem-Wait-Handle ab. |
SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Stellt ein sicheres Handle für ein systemeigenes Betriebssystem-Wait-Handle ein. |
Gilt für:
Threadsicherheit
Diese Klasse ist threadsicher.
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für