AutoResetEvent Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje událost synchronizace vláken, která při signálu uvolní jedno čekající vlákno a pak se automaticky resetuje. Tuto třídu nelze zdědit.
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
- Dědičnost
- Dědičnost
- Dědičnost
- Atributy
Příklady
Následující příklad ukazuje, jak použít AutoResetEvent k uvolnění jednoho vlákna najednou voláním Set metody (v základní třídě) pokaždé, když uživatel stiskne klávesu Enter . Příklad spustí tři vlákna, která čekají na vytvoření AutoResetEvent v signalizačním stavu. První vlákno se uvolní okamžitě, protože AutoResetEvent je již v signalizačním stavu. Tím se resetuje AutoResetEvent stav bez signálu, aby následující vlákna blokovala. Blokovaná vlákna se nevyvolají, dokud je uživatel nespustí po jednom stisknutím klávesy Enter .
Po uvolnění vláken z prvního AutoResetEvent, čekají na další AutoResetEvent , který byl vytvořen v nesignalizovat stavu. Všechny tři vlákna blokují, takže Set metoda musí být volána třikrát, aby bylo možné je všechny uvolnit.
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.
Poznámky
Použijete AutoResetEvent, ManualResetEventa EventWaitHandle pro interakci s vlákny (nebo signalizaci vlákna). Další informace najdete v tématu Interakce s vlákny.
Vlákno čeká na signál voláním AutoResetEvent.WaitOne. Pokud je stav AutoResetEvent bez signálu, vlákno blokuje, dokud se nevolá AutoResetEvent.Set . Volání Set signálů AutoResetEvent , které uvolní čekající vlákno.
AutoResetEvent zůstává signalizovat, dokud Reset se nevolá nebo se uvolní jedno čekací vlákno, kdy se automaticky vrátí do nesignalovaného stavu.
Pokud žádná vlákna nečekají, když AutoResetEvent přejde do signalizačního stavu, stav zůstane signalován, dokud vlákno nebude sledovat signál (voláním WaitOne). Toto vlákno neblokuje: AutoResetEvent uvolní vlákno okamžitě a vrátí se do nezaznamovaného stavu.
Důležitý
Není zaručeno, že každé volání Set metody uvolní vlákno. Pokud jsou dvě volání příliš blízko, takže druhé volání nastane před uvolněním vlákna, uvolní se pouze jedno vlákno. Je to jako kdyby se druhý hovor nestal. Také pokud je volána, pokud Set neexistují žádné vlákna čekající a AutoResetEvent je již signalován, volání nemá žádný účinek.
Počáteční stav objektu AutoResetEvent můžete řídit předáním logické hodnoty konstruktoru: true pokud je počáteční stav signalován a false jinak.
AutoResetEvent lze také použít s metodami staticWaitAll a WaitAny metodami.
AutoResetEvent je odvozena z EventWaitHandle třídy. Je AutoResetEvent funkčně ekvivalentní vytvořenému EventWaitHandle pomocí EventResetMode.AutoReset.
Poznámka
AutoResetEvent Na rozdíl od třídy EventWaitHandle poskytuje třída přístup k pojmenovanými událostem synchronizace systému.
Důležitý
Tento typ implementuje rozhraní IDisposable. Jakmile typ dokončíte, měli byste ho odstranit buď přímo, nebo nepřímo. Chcete-li typ odstranit přímo, zavolejte jeho Dispose metodu v bloku try/catch. Pokud ho chcete zlikvidovat nepřímo, použijte konstruktor jazyka, jako je using (v jazyce C#) nebo Using (v jazyce Visual Basic). Další informace naleznete v části Použití objektu, který implementuje IDisposable na IDisposable stránce rozhraní.
Konstruktory
| Name | Description |
|---|---|
| AutoResetEvent(Boolean) |
Inicializuje novou instanci AutoResetEvent třídy s logickou hodnotou označující, zda má být počáteční stav signalizován. |
Pole
| Name | Description |
|---|---|
| WaitTimeout |
Označuje, že WaitAny(WaitHandle[], Int32, Boolean) operace vypršela před signálem jakéhokoli z popisovačů čekání. Toto pole je konstantní. (Zděděno od WaitHandle) |
Vlastnosti
| Name | Description |
|---|---|
| Handle |
Zastaralé.
Zastaralé.
Získá nebo nastaví nativní popisovač operačního systému. (Zděděno od WaitHandle) |
| SafeWaitHandle |
Získá nebo nastaví nativní popisovač operačního systému. (Zděděno od WaitHandle) |
Metody
| Name | Description |
|---|---|
| Close() |
Uvolní všechny prostředky uchovávané aktuálním WaitHandle. (Zděděno od WaitHandle) |
| CreateObjRef(Type) |
Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy serveru sloužícího ke komunikaci se vzdáleným objektem. (Zděděno od MarshalByRefObject) |
| Dispose() |
Uvolní všechny prostředky používané aktuální instancí WaitHandle třídy. (Zděděno od WaitHandle) |
| Dispose(Boolean) |
Při přepsání v odvozené třídě uvolní nespravované prostředky používané nástrojem WaitHandlea volitelně uvolní spravované prostředky. (Zděděno od WaitHandle) |
| Equals(Object) |
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| GetAccessControl() |
EventWaitHandleSecurity Získá objekt, který představuje zabezpečení řízení přístupu pro pojmenovanou systém událost reprezentovaný aktuálním EventWaitHandle objektem. (Zděděno od EventWaitHandle) |
| GetHashCode() |
Slouží jako výchozí funkce hash. (Zděděno od Object) |
| GetLifetimeService() |
Zastaralé.
Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
| GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
| InitializeLifetimeService() |
Zastaralé.
Získá objekt služby životnosti pro řízení zásad životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| MemberwiseClone(Boolean) |
Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu. (Zděděno od MarshalByRefObject) |
| Reset() |
Nastaví stav události na nepřiřazené, což způsobí blokování vláken. |
| Reset() |
Nastaví stav události na nepřiřazené, což způsobuje blokování vláken. (Zděděno od EventWaitHandle) |
| Set() |
Nastaví stav události na signalizovat, což umožňuje maximálně jedno čekající vlákno pokračovat. |
| Set() |
Nastaví stav události, která signalizovala, což umožňuje pokračování jednoho nebo více čekacích vláken. (Zděděno od EventWaitHandle) |
| SetAccessControl(EventWaitHandleSecurity) |
Nastaví zabezpečení řízení přístupu pro pojmenovanou událost systému. (Zděděno od EventWaitHandle) |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
| WaitOne() |
Blokuje aktuální vlákno, dokud proud WaitHandle neobdrží signál. (Zděděno od WaitHandle) |
| WaitOne(Int32, Boolean) |
Zablokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určí časový interval a určí, jestli se má před čekáním ukončit synchronizační doména. (Zděděno od WaitHandle) |
| WaitOne(Int32) |
Blokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál, pomocí 32bitového znaménka integer určuje časový interval v milisekundách. (Zděděno od WaitHandle) |
| WaitOne(TimeSpan, Boolean) |
Zablokuje aktuální vlákno, dokud aktuální instance neobdrží signál, pomocí parametru TimeSpan a určí, zda se má před čekáním ukončit synchronizační doména. (Zděděno od WaitHandle) |
| WaitOne(TimeSpan) |
Blokuje aktuální vlákno, dokud aktuální instance neobdrží signál pomocí TimeSpan k určení časového intervalu. (Zděděno od WaitHandle) |
Explicitní implementace rozhraní
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Toto rozhraní API podporuje produktovou infrastrukturu a není určené k použití přímo z uživatelského kódu. Uvolní všechny prostředky používané nástrojem WaitHandle. (Zděděno od WaitHandle) |
Metody rozšíření
| Name | Description |
|---|---|
| GetAccessControl(EventWaitHandle) |
Vrátí popisovače zabezpečení pro zadanou |
| GetSafeWaitHandle(WaitHandle) |
Získá bezpečný popisovač pro nativní obslužný rutina čekání operačního systému. |
| SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Nastaví popisovače zabezpečení pro zadaný popisovač čekání na událost. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Nastaví bezpečný popisovač pro nativní obslužný rutinu čekání operačního systému. |
Platí pro
Bezpečný přístup z více vláken
Tato třída je bezpečná pro přístup z více vláken.