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 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 handlehodnotu .

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.

Viz také