ManualResetEvent 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.
Vertegenwoordigt een threadsynchronisatiegebeurtenis die, indien gesignaleerd, handmatig opnieuw moet worden ingesteld. Deze klasse kan niet worden overgenomen.
public ref class ManualResetEvent sealed : System::Threading::EventWaitHandle
public ref class ManualResetEvent sealed : System::Threading::WaitHandle
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
public sealed class ManualResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
type ManualResetEvent = class
inherit EventWaitHandle
type ManualResetEvent = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type ManualResetEvent = class
inherit EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits WaitHandle
- Overname
- Overname
- Overname
- Kenmerken
Voorbeelden
In het volgende voorbeeld ziet u hoe ManualResetEvent het werkt. Het voorbeeld begint met een ManualResetEvent niet-ondertekende status (dat wil gezegd, false wordt doorgegeven aan de constructor). In het voorbeeld worden drie threads gemaakt, die elk worden geblokkeerd door de ManualResetEvent methode aan WaitOne te roepen. Wanneer de gebruiker op de Enter-toets drukt, roept het voorbeeld de Set methode aan, waarmee alle drie de threads worden vrijgegeven. Vergelijk dit met het gedrag van de AutoResetEvent klasse, waarmee threads één voor één worden vrijgegeven, die na elke release automatisch opnieuw worden ingesteld.
Als u nogmaals op de Enter-toets drukt, ziet u dat de status blijft behouden totdat Reset de ManualResetEvent methode wordt aangeroepen: Het voorbeeld start nog twee threads. Deze threads blokkeren niet wanneer ze de WaitOne methode aanroepen, maar worden in plaats daarvan uitgevoerd op voltooiing.
Als u nogmaals op de Enter-toets drukt, wordt de methode aangeroepen en wordt er nog een thread gestart, die wordt geblokkeerd wanneer deze wordt aangeroepen ResetWaitOne. Als u de Enter-toets nog één keer oproeptSet om de laatste thread vrij te geven en het programma wordt beëindigd.
using System;
using System.Threading;
public class Example
{
// mre is used to block and release threads manually. It is
// created in the unsignaled state.
private static ManualResetEvent mre = new ManualResetEvent(false);
static void Main()
{
Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");
for(int i = 0; i <= 2; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
"\nto release all the threads.\n");
Console.ReadLine();
mre.Set();
Thread.Sleep(500);
Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
"\ndo not block. Press Enter to show this.\n");
Console.ReadLine();
for(int i = 3; i <= 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
"\nwhen they call WaitOne().\n");
Console.ReadLine();
mre.Reset();
// Start a thread that waits on the ManualResetEvent.
Thread t5 = new Thread(ThreadProc);
t5.Name = "Thread_5";
t5.Start();
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
Console.ReadLine();
mre.Set();
// If you run this example in Visual Studio, uncomment the following line:
//Console.ReadLine();
}
private static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine(name + " starts and calls mre.WaitOne()");
mre.WaitOne();
Console.WriteLine(name + " ends.");
}
}
/* This example produces output similar to the following:
Start 3 named threads that block on a ManualResetEvent:
Thread_0 starts and calls mre.WaitOne()
Thread_1 starts and calls mre.WaitOne()
Thread_2 starts and calls mre.WaitOne()
When all three threads have started, press Enter to call Set()
to release all the threads.
Thread_2 ends.
Thread_0 ends.
Thread_1 ends.
When a ManualResetEvent is signaled, threads that call WaitOne()
do not block. Press Enter to show this.
Thread_3 starts and calls mre.WaitOne()
Thread_3 ends.
Thread_4 starts and calls mre.WaitOne()
Thread_4 ends.
Press Enter to call Reset(), so that threads once again block
when they call WaitOne().
Thread_5 starts and calls mre.WaitOne()
Press Enter to call Set() and conclude the demo.
Thread_5 ends.
*/
Imports System.Threading
Public Class Example
' mre is used to block and release threads manually. It is
' created in the unsignaled state.
Private Shared mre As New ManualResetEvent(False)
<MTAThreadAttribute> _
Shared Sub Main()
Console.WriteLine(vbLf & _
"Start 3 named threads that block on a ManualResetEvent:" & vbLf)
For i As Integer = 0 To 2
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next i
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"When all three threads have started, press Enter to call Set()" & vbLf & _
"to release all the threads." & vbLf)
Console.ReadLine()
mre.Set()
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"When a ManualResetEvent is signaled, threads that call WaitOne()" & vbLf & _
"do not block. Press Enter to show this." & vbLf)
Console.ReadLine()
For i As Integer = 3 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next i
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"Press Enter to call Reset(), so that threads once again block" & vbLf & _
"when they call WaitOne()." & vbLf)
Console.ReadLine()
mre.Reset()
' Start a thread that waits on the ManualResetEvent.
Dim t5 As New Thread(AddressOf ThreadProc)
t5.Name = "Thread_5"
t5.Start()
Thread.Sleep(500)
Console.WriteLine(vbLf & "Press Enter to call Set() and conclude the demo.")
Console.ReadLine()
mre.Set()
' If you run this example in Visual Studio, uncomment the following line:
'Console.ReadLine()
End Sub
Private Shared Sub ThreadProc()
Dim name As String = Thread.CurrentThread.Name
Console.WriteLine(name & " starts and calls mre.WaitOne()")
mre.WaitOne()
Console.WriteLine(name & " ends.")
End Sub
End Class
' This example produces output similar to the following:
'
'Start 3 named threads that block on a ManualResetEvent:
'
'Thread_0 starts and calls mre.WaitOne()
'Thread_1 starts and calls mre.WaitOne()
'Thread_2 starts and calls mre.WaitOne()
'
'When all three threads have started, press Enter to call Set()
'to release all the threads.
'
'
'Thread_2 ends.
'Thread_0 ends.
'Thread_1 ends.
'
'When a ManualResetEvent is signaled, threads that call WaitOne()
'do not block. Press Enter to show this.
'
'
'Thread_3 starts and calls mre.WaitOne()
'Thread_3 ends.
'Thread_4 starts and calls mre.WaitOne()
'Thread_4 ends.
'
'Press Enter to call Reset(), so that threads once again block
'when they call WaitOne().
'
'
'Thread_5 starts and calls mre.WaitOne()
'
'Press Enter to call Set() and conclude the demo.
'
'Thread_5 ends.
Opmerkingen
U gebruikt ManualResetEvent, AutoResetEventen EventWaitHandle voor threadinteractie (of thread signalering). Zie de sectie Thread-interactie of signaleringssectie van het artikel Overzicht van synchronisatieprimitief voor meer informatie.
Wanneer een thread een activiteit start die moet worden voltooid voordat andere threads verdergaan, wordt ManualResetEvent.Reset aanroepen om de niet-gesignaleerde status in te stellen ManualResetEvent . Deze thread kan worden beschouwd als het beheersen van de ManualResetEvent. Threads die ManualResetEvent.WaitOne-blok aanroepen, wachtend op het signaal. Wanneer de controlethread de activiteit voltooit, wordt ManualResetEvent.Set aanroepen om aan te geven dat de wachtende threads kunnen doorgaan. Alle wachtende threads worden vrijgegeven.
Zodra het is gesignaleerd, ManualResetEvent blijft dit gesignaleerd totdat deze handmatig opnieuw wordt ingesteld door de Reset() methode aan te roepen. Dat wil gezegd, oproepen om onmiddellijk terug te WaitOne keren.
U kunt de initiële status van een bestand ManualResetEvent beheren door een Booleaanse waarde door te geven aan de constructor: true als de oorspronkelijke status wordt gesignaleerd en false anders.
ManualResetEvent kan ook worden gebruikt met de staticWaitAll en WaitAny methoden.
Vanaf .NET Framework versie 2.0 is ManualResetEvent afgeleid van de klasse EventWaitHandle. A ManualResetEvent is functioneel gelijk aan een EventWaitHandle gemaakt met EventResetMode.ManualReset.
Note
In tegenstelling tot de ManualResetEvent klasse biedt de EventWaitHandle klasse toegang tot benoemde systeemsynchronisatie-gebeurtenissen.
Vanaf de .NET Framework versie 4.0 is de klasse System.Threading.ManualResetEventSlim een lichtgewicht alternatief voor ManualResetEvent.
Constructors
| Name | Description |
|---|---|
| ManualResetEvent(Boolean) |
Initialiseert een nieuw exemplaar van de ManualResetEvent klasse met een Booleaanse waarde die aangeeft of de initiële status moet worden ingesteld op gesignaleerd. |
Velden
| Name | Description |
|---|---|
| WaitTimeout |
Geeft aan dat er een time-out optreedt voordat een WaitAny(WaitHandle[], Int32, Boolean) van de wachtgrepen is gesignaleerd. Dit veld is constant. (Overgenomen van WaitHandle) |
Eigenschappen
| Name | Description |
|---|---|
| Handle |
Verouderd.
Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in. (Overgenomen van WaitHandle) |
| SafeWaitHandle |
Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in. (Overgenomen van WaitHandle) |
Methoden
| Name | Description |
|---|---|
| Close() |
Alle resources die door de huidige WaitHandleresources worden bewaard, worden vrijgegeven. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetAccessControl() |
Hiermee haalt u een EventWaitHandleSecurity object op dat de beveiliging van toegangsbeheer vertegenwoordigt voor de benoemde systeem gebeurtenis die wordt vertegenwoordigd door het huidige EventWaitHandle object. (Overgenomen van EventWaitHandle) |
| 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) |
| Reset() |
Hiermee stelt u de status van de gebeurtenis in op niet-ondertekend, waardoor threads worden geblokkeerd. |
| Reset() |
Hiermee stelt u de status van de gebeurtenis in op niet-ondertekend, waardoor threads worden geblokkeerd. (Overgenomen van EventWaitHandle) |
| Set() |
Hiermee stelt u de status van de gebeurtenis in op signalering, waardoor een of meer wachtthreads kunnen worden voortgezet. |
| Set() |
Hiermee stelt u de status van de gebeurtenis in op signalering, zodat een of meer wachtthreads kunnen worden voortgezet. (Overgenomen van EventWaitHandle) |
| SetAccessControl(EventWaitHandleSecurity) |
Hiermee stelt u de beveiliging voor toegangsbeheer in voor een benoemde systeem gebeurtenis. (Overgenomen van EventWaitHandle) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
| WaitOne() |
Hiermee blokkeert u de huidige thread totdat de stroom WaitHandle een signaal ontvangt. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
| 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. (Overgenomen van WaitHandle) |
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. (Overgenomen van 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
Deze klasse is thread veilig.
Zie ook
- WaitHandle
- Het Beheerd Draadbeheer
- Overzicht van synchronisatie primitiefen