EventWaitHandle Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Representerar en trådsynkroniseringshändelse.
public ref class EventWaitHandle : System::Threading::WaitHandle
public class EventWaitHandle : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public class EventWaitHandle : System.Threading.WaitHandle
type EventWaitHandle = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type EventWaitHandle = class
inherit WaitHandle
Public Class EventWaitHandle
Inherits WaitHandle
- Arv
- Arv
- Härledda
- Attribut
Exempel
I följande kodexempel används metodöverbelastningen SignalAndWait(WaitHandle, WaitHandle) för att låta huvudtråden signalera en blockerad tråd och sedan vänta tills tråden har slutfört en uppgift.
Exemplet startar fem trådar och gör att de kan blockera på en EventWaitHandle som skapats med EventResetMode.AutoReset flaggan och släpper sedan en tråd varje gång användaren trycker på Retur-tangenten . Exemplet köar sedan ytterligare fem trådar och släpper dem alla med hjälp av en EventWaitHandle skapad med EventResetMode.ManualReset flaggan.
using System;
using System.Threading;
public class Example
{
// The EventWaitHandle used to demonstrate the difference
// between AutoReset and ManualReset synchronization events.
//
private static EventWaitHandle ewh;
// A counter to make sure all threads are started and
// blocked before any are released. A Long is used to show
// the use of the 64-bit Interlocked methods.
//
private static long threadCount = 0;
// An AutoReset event that allows the main thread to block
// until an exiting thread has decremented the count.
//
private static EventWaitHandle clearCount =
new EventWaitHandle(false, EventResetMode.AutoReset);
[MTAThread]
public static void Main()
{
// Create an AutoReset EventWaitHandle.
//
ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
// Create and start five numbered threads. Use the
// ParameterizedThreadStart delegate, so the thread
// number can be passed as an argument to the Start
// method.
for (int i = 0; i <= 4; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
}
// Wait until all the threads have started and blocked.
// When multiple threads use a 64-bit value on a 32-bit
// system, you must access the value through the
// Interlocked class to guarantee thread safety.
//
while (Interlocked.Read(ref threadCount) < 5)
{
Thread.Sleep(500);
}
// Release one thread each time the user presses ENTER,
// until all threads have been released.
//
while (Interlocked.Read(ref threadCount) > 0)
{
Console.WriteLine("Press ENTER to release a waiting thread.");
Console.ReadLine();
// SignalAndWait signals the EventWaitHandle, which
// releases exactly one thread before resetting,
// because it was created with AutoReset mode.
// SignalAndWait then blocks on clearCount, to
// allow the signaled thread to decrement the count
// before looping again.
//
WaitHandle.SignalAndWait(ewh, clearCount);
}
Console.WriteLine();
// Create a ManualReset EventWaitHandle.
//
ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
// Create and start five more numbered threads.
//
for(int i=0; i<=4; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
}
// Wait until all the threads have started and blocked.
//
while (Interlocked.Read(ref threadCount) < 5)
{
Thread.Sleep(500);
}
// Because the EventWaitHandle was created with
// ManualReset mode, signaling it releases all the
// waiting threads.
//
Console.WriteLine("Press ENTER to release the waiting threads.");
Console.ReadLine();
ewh.Set();
}
public static void ThreadProc(object data)
{
int index = (int) data;
Console.WriteLine("Thread {0} blocks.", data);
// Increment the count of blocked threads.
Interlocked.Increment(ref threadCount);
// Wait on the EventWaitHandle.
ewh.WaitOne();
Console.WriteLine("Thread {0} exits.", data);
// Decrement the count of blocked threads.
Interlocked.Decrement(ref threadCount);
// After signaling ewh, the main thread blocks on
// clearCount until the signaled thread has
// decremented the count. Signal it now.
//
clearCount.Set();
}
}
Imports System.Threading
Public Class Example
' The EventWaitHandle used to demonstrate the difference
' between AutoReset and ManualReset synchronization events.
'
Private Shared ewh As EventWaitHandle
' A counter to make sure all threads are started and
' blocked before any are released. A Long is used to show
' the use of the 64-bit Interlocked methods.
'
Private Shared threadCount As Long = 0
' An AutoReset event that allows the main thread to block
' until an exiting thread has decremented the count.
'
Private Shared clearCount As New EventWaitHandle(False, _
EventResetMode.AutoReset)
<MTAThread> _
Public Shared Sub Main()
' Create an AutoReset EventWaitHandle.
'
ewh = New EventWaitHandle(False, EventResetMode.AutoReset)
' Create and start five numbered threads. Use the
' ParameterizedThreadStart delegate, so the thread
' number can be passed as an argument to the Start
' method.
For i As Integer = 0 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Start(i)
Next i
' Wait until all the threads have started and blocked.
' When multiple threads use a 64-bit value on a 32-bit
' system, you must access the value through the
' Interlocked class to guarantee thread safety.
'
While Interlocked.Read(threadCount) < 5
Thread.Sleep(500)
End While
' Release one thread each time the user presses ENTER,
' until all threads have been released.
'
While Interlocked.Read(threadCount) > 0
Console.WriteLine("Press ENTER to release a waiting thread.")
Console.ReadLine()
' SignalAndWait signals the EventWaitHandle, which
' releases exactly one thread before resetting,
' because it was created with AutoReset mode.
' SignalAndWait then blocks on clearCount, to
' allow the signaled thread to decrement the count
' before looping again.
'
WaitHandle.SignalAndWait(ewh, clearCount)
End While
Console.WriteLine()
' Create a ManualReset EventWaitHandle.
'
ewh = New EventWaitHandle(False, EventResetMode.ManualReset)
' Create and start five more numbered threads.
'
For i As Integer = 0 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Start(i)
Next i
' Wait until all the threads have started and blocked.
'
While Interlocked.Read(threadCount) < 5
Thread.Sleep(500)
End While
' Because the EventWaitHandle was created with
' ManualReset mode, signaling it releases all the
' waiting threads.
'
Console.WriteLine("Press ENTER to release the waiting threads.")
Console.ReadLine()
ewh.Set()
End Sub
Public Shared Sub ThreadProc(ByVal data As Object)
Dim index As Integer = CInt(data)
Console.WriteLine("Thread {0} blocks.", data)
' Increment the count of blocked threads.
Interlocked.Increment(threadCount)
' Wait on the EventWaitHandle.
ewh.WaitOne()
Console.WriteLine("Thread {0} exits.", data)
' Decrement the count of blocked threads.
Interlocked.Decrement(threadCount)
' After signaling ewh, the main thread blocks on
' clearCount until the signaled thread has
' decremented the count. Signal it now.
'
clearCount.Set()
End Sub
End Class
Kommentarer
Klassen EventWaitHandle tillåter trådar att kommunicera med varandra genom signalering. Vanligtvis blockeras en eller flera trådar på en EventWaitHandle tills en avblockerad tråd anropar Set metoden och släpper en eller flera av de blockerade trådarna. En tråd kan signalera en EventWaitHandle och sedan blockera den genom att anropa metoden static (Shared i Visual Basic) WaitHandle.SignalAndWait.
Note
Klassen EventWaitHandle ger åtkomst till namngivna systemsynkroniseringshändelser.
Beteendet för en EventWaitHandle som har signalerats beror på dess återställningsläge. En EventWaitHandle som skapas med EventResetMode.AutoReset flaggan återställs automatiskt när den signaleras, efter att en enda väntande tråd har släppts. En EventWaitHandle skapad med EventResetMode.ManualReset flaggan förblir signalerad tills dess Reset metod anropas.
Händelser för automatisk återställning ger exklusiv åtkomst till en resurs. Om en automatisk återställningshändelse signaleras när inga trådar väntar, förblir den signalerad tills en tråd försöker vänta på den. Händelsen släpper tråden och återställs omedelbart och blockerar efterföljande trådar.
Manuella återställningshändelser är som portar. När händelsen inte signaleras blockeras trådar som väntar på den. När händelsen signaleras släpps alla väntande trådar och händelsen förblir signalerad (dvs. efterföljande väntetider blockeras inte) tills dess Reset metod anropas. Manuella återställningshändelser är användbara när en tråd måste slutföra en aktivitet innan andra trådar kan fortsätta.
EventWaitHandle objekt kan användas med metoderna static(Shared i Visual Basic) WaitHandle.WaitAll och WaitHandle.WaitAny.
Mer information finns i avsnittet Trådinteraktion eller signalering i artikeln Översikt över synkroniseringsprimitiver .
Caution
Som standard är en namngiven händelse inte begränsad till den användare som skapade den. Andra användare kanske kan öppna och använda händelsen, inklusive att störa händelsen genom att ställa in eller återställa den på ett olämpligt sätt. Om du vill begränsa åtkomsten till specifika användare kan du använda en konstruktoröverlagring eller EventWaitHandleAcl skicka in en EventWaitHandleSecurity när du skapar den namngivna händelsen. Undvik att använda namngivna händelser utan åtkomstbegränsningar för system som kan ha obetrodda användare som kör kod.
Konstruktorer
| Name | Description |
|---|---|
| EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) |
Initierar en ny instans av EventWaitHandle klassen och anger om väntehandtaget först signaleras om det skapas till följd av det här anropet, oavsett om det återställs automatiskt eller manuellt, namnet på en systemsynkroniseringshändelse, en boolesk variabel vars värde efter anropet anger om den namngivna systemhändelsen skapades och åtkomstkontrollsäkerheten som ska tillämpas på den namngivna händelsen om den skapas. |
| EventWaitHandle(Boolean, EventResetMode, String, Boolean) |
Initierar en ny instans av EventWaitHandle klassen och anger om väntehandtaget först signaleras om det skapas som ett resultat av det här anropet, oavsett om det återställs automatiskt eller manuellt, namnet på en systemsynkroniseringshändelse och en boolesk variabel vars värde efter anropet anger om den namngivna systemhändelsen skapades. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean) |
Initierar en ny instans av EventWaitHandle klassen och anger om väntehandtaget först signaleras om det skapas till följd av det här anropet, om det återställs automatiskt eller manuellt, namnet på en systemsynkroniseringshändelse, alternativ för att ange åtkomst till användaromfattning och sessionsomfång och en boolesk variabel vars värde efter anropet anger om den namngivna systemhändelsen skapades. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions) |
Initierar en ny instans av EventWaitHandle klassen och anger om väntehandtaget först signaleras om det skapas som ett resultat av det här anropet, oavsett om det återställs automatiskt eller manuellt, namnet på en systemsynkroniseringshändelse och alternativ för att ange åtkomst för användaromfattning och sessionsomfattning. |
| EventWaitHandle(Boolean, EventResetMode, String) |
Initierar en ny instans av EventWaitHandle klassen och anger om väntehandtaget först signaleras om det skapas till följd av det här anropet, om det återställs automatiskt eller manuellt och namnet på en systemsynkroniseringshändelse. |
| EventWaitHandle(Boolean, EventResetMode) |
Initierar en ny instans av EventWaitHandle klassen, anger om väntehandtaget först signaleras och om det återställs automatiskt eller manuellt. |
Fält
| Name | Description |
|---|---|
| WaitTimeout |
Anger att tidsgränsen för en WaitAny(WaitHandle[], Int32, Boolean) åtgärd uppstod innan någon av väntehandtagen signalerades. Det här fältet är konstant. (Ärvd från WaitHandle) |
Egenskaper
| Name | Description |
|---|---|
| Handle |
Föråldrad.
Föråldrad.
Hämtar eller anger det interna operativsystemets handtag. (Ärvd från WaitHandle) |
| SafeWaitHandle |
Hämtar eller anger det interna operativsystemets handtag. (Ärvd från WaitHandle) |
Metoder
| Name | Description |
|---|---|
| Close() |
Släpper alla resurser som innehas av den aktuella WaitHandle. (Ärvd från WaitHandle) |
| CreateObjRef(Type) |
Skapar ett objekt som innehåller all relevant information som krävs för att generera en proxy som används för att kommunicera med ett fjärrobjekt. (Ärvd från MarshalByRefObject) |
| Dispose() |
Släpper alla resurser som används av den aktuella instansen WaitHandle av klassen. (Ärvd från WaitHandle) |
| Dispose(Boolean) |
När de åsidosättas i en härledd klass släpper du de ohanterade resurser som används av WaitHandle, och släpper eventuellt de hanterade resurserna. (Ärvd från WaitHandle) |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetAccessControl() |
Hämtar ett EventWaitHandleSecurity objekt som representerar åtkomstkontrollsäkerheten för den namngivna systemhändelsen som representeras av det aktuella EventWaitHandle objektet. |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetLifetimeService() |
Föråldrad.
Hämtar det aktuella livslängdstjänstobjektet som styr livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| InitializeLifetimeService() |
Föråldrad.
Hämtar ett tjänstobjekt för livslängd för att styra livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| MemberwiseClone(Boolean) |
Skapar en ytlig kopia av det aktuella MarshalByRefObject objektet. (Ärvd från MarshalByRefObject) |
| OpenExisting(String, EventWaitHandleRights) |
Öppnar den angivna namngivna synkroniseringshändelsen, om den redan finns, med önskad säkerhetsåtkomst. |
| OpenExisting(String, NamedWaitHandleOptions) |
Öppnar den angivna namngivna synkroniseringshändelsen om den redan finns. Om alternativen endast är inställda på den aktuella användaren verifieras objektets åtkomstkontroller för den anropande användaren. |
| OpenExisting(String) |
Öppnar den angivna namngivna synkroniseringshändelsen om den redan finns. |
| Reset() |
Anger tillståndet för händelsen till icke-signalerad, vilket gör att trådar blockeras. |
| Set() |
Anger status för händelsen till signalerad, vilket gör att en eller flera väntande trådar kan fortsätta. |
| SetAccessControl(EventWaitHandleSecurity) |
Anger åtkomstkontrollsäkerhet för en namngiven systemhändelse. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| TryOpenExisting(String, EventWaitHandle) |
Öppnar den angivna namngivna synkroniseringshändelsen, om den redan finns, och returnerar ett värde som anger om åtgärden lyckades. |
| TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle) |
Öppnar den angivna namngivna synkroniseringshändelsen, om den redan finns, med önskad säkerhetsåtkomst, och returnerar ett värde som anger om åtgärden lyckades. |
| TryOpenExisting(String, NamedWaitHandleOptions, EventWaitHandle) |
Öppnar den angivna namngivna synkroniseringshändelsen, om den redan finns, och returnerar ett värde som anger om åtgärden lyckades. Om alternativen endast är inställda på den aktuella användaren verifieras objektets åtkomstkontroller för den anropande användaren. |
| WaitOne() |
Blockerar den aktuella tråden tills strömmen WaitHandle tar emot en signal. (Ärvd från WaitHandle) |
| WaitOne(Int32, Boolean) |
Blockerar den aktuella tråden tills den aktuella WaitHandle tar emot en signal med ett 32-bitars signerat heltal för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. (Ärvd från WaitHandle) |
| WaitOne(Int32) |
Blockerar den aktuella tråden tills strömmen WaitHandle tar emot en signal med hjälp av ett 32-bitars signerat heltal för att ange tidsintervallet i millisekunder. (Ärvd från WaitHandle) |
| WaitOne(TimeSpan, Boolean) |
Blockerar den aktuella tråden tills den aktuella instansen tar emot en signal med hjälp av en TimeSpan för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. (Ärvd från WaitHandle) |
| WaitOne(TimeSpan) |
Blockerar den aktuella tråden tills den aktuella instansen tar emot en signal med hjälp av en TimeSpan för att ange tidsintervallet. (Ärvd från WaitHandle) |
Explicita gränssnittsimplementeringar
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Detta API stöder produktinfrastrukturen och är inte avsett att användas direkt från koden. Släpper alla resurser som används av WaitHandle. (Ärvd från WaitHandle) |
Tilläggsmetoder
| Name | Description |
|---|---|
| GetAccessControl(EventWaitHandle) |
Returnerar säkerhetsbeskrivningarna för angivna |
| GetSafeWaitHandle(WaitHandle) |
Hämtar det säkra handtaget för ett inbyggt väntehandtag för operativsystemet. |
| SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Anger säkerhetsbeskrivningarna för det angivna händelseväntehandtaget. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Anger ett säkert handtag för ett inbyggt väntehandtag för operativsystemet. |
Gäller för
Trådsäkerhet
Den här typen är trådsäker.