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 současně voláním Set metody (v základní třídě) pokaždé, když uživatel stiskne Enter klávesu. Příklad spustí tři vlákna, která čekají na AutoResetEvent, který byl vytvořen 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 obnoví AutoResetEvent do nesignalovaného stavu, 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í podprocesů z prvního AutoResetEventčekají na další AutoResetEvent, který byl vytvořen v nesignalizačním 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 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.
Poznámky
Používáte AutoResetEvent
, ManualResetEventa EventWaitHandle pro interakci s vlákny (nebo signalizaci vlákna). Další informace naleznete v tématu Interakce vláken.
Vlákno čeká na signál voláním AutoResetEvent.WaitOne. Pokud je AutoResetEvent
v nezaznaném stavu, vlákno blokuje, dokud AutoResetEvent.Set se nevolá. Volání Set
signály AutoResetEvent
k uvolnění čekající vlákna.
AutoResetEvent
zůstává signalizovat, dokud se nevolá Reset
nebo se uvolní jedno čekající 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 nesignalizačního stavu.
Důležitý
Není zaručeno, že každé volání metody Set 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. Pokud se také volá Set, když neexistují žádná vlákna čekající a AutoResetEvent je již signalován, volání nemá žádný vliv.
Počáteční stav 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 static
WaitAll a WaitAny.
AutoResetEvent odvozuje z třídy EventWaitHandle. AutoResetEvent je funkčně ekvivalentní EventWaitHandle vytvořené pomocí EventResetMode.AutoReset.
Poznámka
Na rozdíl od třídy AutoResetEvent poskytuje třída EventWaitHandle 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 "Using an Object that Implements IDisposable" (Použití objektu, který implementuje IDisposable) na stránce rozhraní IDisposable.
Konstruktory
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
WaitTimeout |
Označuje, že vypršel časový limit WaitAny(WaitHandle[], Int32, Boolean) operace před signálem některého z popisovačů čekání. Toto pole je konstantní. (Zděděno od WaitHandle) |
Vlastnosti
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
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í třídy WaitHandle. (Zděděno od WaitHandle) |
Dispose(Boolean) |
Při přepsání v odvozené třídě uvolní nespravované prostředky používané 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() |
Získá EventWaitHandleSecurity objekt, který představuje zabezpečení řízení přístupu pro pojmenovanou systém událost reprezentovaný aktuálním EventWaitHandle objektu. (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 objektu MarshalByRefObject. (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 aktuální WaitHandle neobdrží signál. (Zděděno od WaitHandle) |
WaitOne(Int32) |
Blokuje aktuální vlákno, dokud aktuální WaitHandle neobdrží signál pomocí 32bitového znaménka k určení časového intervalu v milisekundách. (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čí, 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) |
WaitOne(TimeSpan, Boolean) |
Blokuje aktuální vlákno, dokud aktuální instance neobdrží signál, pomocí TimeSpan určit časový interval a určit, zda se má před čekáním ukončit synchronizační doména. (Zděděno od WaitHandle) |
Explicitní implementace rozhraní
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é WaitHandle. (Zděděno od WaitHandle) |
Metody rozšíření
GetAccessControl(EventWaitHandle) |
Vrátí popisovače zabezpečení pro zadanou |
SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Nastaví popisovače zabezpečení pro zadaný popisovač čekání na událost. |
GetSafeWaitHandle(WaitHandle) |
Získá bezpečný popisovač pro nativní obslužný rutina čekání operačního systému. |
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.