Sdílet prostřednictvím


AutoResetEvent Třída

Definice

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 staticWaitAll 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 handle.

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.

Viz také