AutoResetEvent Klasa

Definicja

Reprezentuje zdarzenie synchronizacji wątków, które po zasygnaliwie zwalnia jeden pojedynczy wątek oczekiwania, a następnie automatycznie resetuje. Tej klasy nie można dziedziczyć.

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
Dziedziczenie
Dziedziczenie
Dziedziczenie
Atrybuty

Przykłady

W poniższym przykładzie pokazano, jak użyć AutoResetEvent polecenia , aby zwolnić jeden wątek naraz, wywołując Set metodę (w klasie bazowej) za każdym razem, gdy użytkownik naciska klawisz Enter . W przykładzie uruchamia się trzy wątki, które oczekują na utworzony AutoResetEvent element w stanie sygnału. Pierwszy wątek jest natychmiast zwalniany, ponieważ AutoResetEvent element jest już w stanie sygnalizowanym. Spowoduje to zresetowanie AutoResetEvent wartości do stanu niesygnalizowanego, tak aby kolejne wątki blokowały. Zablokowane wątki nie są zwalniane, dopóki użytkownik nie zwolni ich pojedynczo, naciskając klawisz Enter .

Po zwolnieniu wątków z pierwszego AutoResetEventelementu czekają na inny AutoResetEvent , który został utworzony w stanie niesygnalizowanym. Wszystkie trzy wątki bloku, więc Set metoda musi być wywoływana trzy razy, aby zwolnić je wszystkie.

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.

Uwagi

Do interakcji wątków (lub sygnalizowania wątku) używa się elementów AutoResetEvent, ManualResetEventi EventWaitHandle . Aby uzyskać więcej informacji, zobacz Interakcja wątku.

Wątek czeka na sygnał, wywołując polecenie AutoResetEvent.WaitOne. Jeśli element AutoResetEvent znajduje się w stanie niesygnalizowany, wątek blokuje się do momentu wywołania parametru AutoResetEvent.Set . Wywoływanie Set sygnałów AutoResetEvent zwalniających wątek oczekiwania. AutoResetEvent pozostaje zasygnalizowany, dopóki Reset nie zostanie wywołany lub zostanie zwolniony pojedynczy wątek oczekiwania, w którym automatycznie powróci do stanu niesygnalizowanego.

Jeśli żaden wątek nie czeka, gdy AutoResetEvent element przechodzi do stanu sygnalizowanego, stan pozostaje zasygnalizowany, dopóki wątek nie zauważy sygnału (wywołując metodę WaitOne). Ten wątek nie blokuje: AutoResetEvent wątku natychmiast zwalnia i wraca do stanu niesygnalizowanego.

Ważny

Nie ma gwarancji, że każde wywołanie Set metody zwolni wątek. Jeśli dwa wywołania są zbyt blisko siebie, aby drugie wywołanie nastąpiło przed wydaniem wątku, zostanie zwolniony tylko jeden wątek. To tak, jakby drugie wywołanie nie miało miejsce. Ponadto, jeśli Set wywołanie jest wywoływane, gdy nie ma żadnych wątków oczekujących i AutoResetEvent jest już zasygnalizowany, wywołanie nie ma żadnego efektu.

Stan początkowy elementu AutoResetEvent można kontrolować, przekazując wartość logiczną do konstruktora: true jeśli stan początkowy jest zasygnalizowany i false w inny sposób.

AutoResetEvent można również używać z metodami staticWaitAll i WaitAny .

AutoResetEvent pochodzi z EventWaitHandle klasy . Element AutoResetEvent jest funkcjonalnie równoważny z utworzonym elementem EventWaitHandleEventResetMode.AutoReset.

Nuta

AutoResetEvent W przeciwieństwie do klasy EventWaitHandle klasa zapewnia dostęp do nazwanych zdarzeń synchronizacji systemu.

Ważny

Ten typ implementuje interfejs IDisposable. Po zakończeniu korzystania z typu należy usunąć go bezpośrednio lub pośrednio. Aby usunąć typ bezpośrednio, wywołaj metodę Dispose w bloku try/catch. Aby usunąć go pośrednio, należy użyć konstrukcji języka, takiej jak using (w języku C#) lub Using (w Visual Basic). Aby uzyskać więcej informacji, zobacz sekcję "Using an Object that Implements IDisposable" (Używanie obiektu implementujące interfejs IDisposable) na stronie interfejsu IDisposable .

Konstruktory

Nazwa Opis
AutoResetEvent(Boolean)

Inicjuje nowe wystąpienie AutoResetEvent klasy z wartością logiczną wskazującą, czy ustawić stan początkowy na sygnalizowany.

Pola

Nazwa Opis
WaitTimeout

Wskazuje, że WaitAny(WaitHandle[], Int32, Boolean) upłynął limit czasu operacji, zanim zostanie zasygnalizowana którakolwiek z dojść oczekiwania. To pole jest stałe.

(Odziedziczone po WaitHandle)

Właściwości

Nazwa Opis
Handle
Przestarzałe.
Przestarzałe.

Pobiera lub ustawia natywny uchwyt systemu operacyjnego.

(Odziedziczone po WaitHandle)
SafeWaitHandle

Pobiera lub ustawia natywny uchwyt systemu operacyjnego.

(Odziedziczone po WaitHandle)

Metody

Nazwa Opis
Close()

Zwalnia wszystkie zasoby przechowywane przez bieżący WaitHandleelement .

(Odziedziczone po WaitHandle)
CreateObjRef(Type)

Tworzy obiekt zawierający wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikowania się z obiektem zdalnym.

(Odziedziczone po MarshalByRefObject)
Dispose()

Zwalnia wszystkie zasoby używane przez bieżące wystąpienie WaitHandle klasy.

(Odziedziczone po WaitHandle)
Dispose(Boolean)

Po zastąpieniu w klasie pochodnej zwalnia niezarządzane zasoby używane przez WaitHandleprogram i opcjonalnie zwalnia zarządzane zasoby.

(Odziedziczone po WaitHandle)
Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.

(Odziedziczone po Object)
GetAccessControl()

EventWaitHandleSecurity Pobiera obiekt reprezentujący zabezpieczenia kontroli dostępu dla nazwanego zdarzenia systemowego reprezentowanego przez bieżący EventWaitHandle obiekt.

(Odziedziczone po EventWaitHandle)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetLifetimeService()
Przestarzałe.

Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
InitializeLifetimeService()
Przestarzałe.

Uzyskuje obiekt usługi okresu istnienia w celu kontrolowania zasad okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
MemberwiseClone(Boolean)

Tworzy płytkią kopię bieżącego MarshalByRefObject obiektu.

(Odziedziczone po MarshalByRefObject)
Reset()

Ustawia stan zdarzenia na niepodpisany, co powoduje zablokowanie wątków.

Reset()

Ustawia stan zdarzenia na niepodpisany, powodując zablokowanie wątków.

(Odziedziczone po EventWaitHandle)
Set()

Ustawia stan zdarzenia na zasygnalizowany, co pozwala na co najwyżej jeden wątek oczekiwania na kontynuowanie.

Set()

Ustawia stan zdarzenia na zasygnalizowany, umożliwiając kontynuowanie co najmniej jednego wątku oczekiwania.

(Odziedziczone po EventWaitHandle)
SetAccessControl(EventWaitHandleSecurity)

Ustawia zabezpieczenia kontroli dostępu dla nazwanego zdarzenia systemowego.

(Odziedziczone po EventWaitHandle)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)
WaitOne()

Blokuje bieżący wątek, dopóki bieżący nie WaitHandle otrzyma sygnału.

(Odziedziczone po WaitHandle)
WaitOne(Int32, Boolean)

Blokuje bieżący wątek do momentu WaitHandle odebrania sygnału przy użyciu 32-bitowej liczby całkowitej ze znakiem, aby określić interwał czasu i określić, czy zakończyć domenę synchronizacji przed oczekiwaniem.

(Odziedziczone po WaitHandle)
WaitOne(Int32)

Blokuje bieżący wątek do momentu WaitHandle odebrania sygnału przy użyciu 32-bitowej liczby całkowitej ze znakiem w celu określenia interwału czasu w milisekundach.

(Odziedziczone po WaitHandle)
WaitOne(TimeSpan, Boolean)

Blokuje bieżący wątek, dopóki bieżące wystąpienie nie odbierze sygnału, używając parametru , TimeSpan aby określić interwał czasu i określić, czy należy zamknąć domenę synchronizacji przed oczekiwaniem.

(Odziedziczone po WaitHandle)
WaitOne(TimeSpan)

Blokuje bieżący wątek do momentu odebrania sygnału przez bieżące wystąpienie przy użyciu parametru , TimeSpan aby określić interwał czasu.

(Odziedziczone po WaitHandle)

Jawne implementacje interfejsu

Nazwa Opis
IDisposable.Dispose()

Ten interfejs API obsługuje infrastrukturę produktu i nie jest przeznaczony do użycia bezpośrednio z poziomu kodu.

Zwalnia wszystkie zasoby używane przez program WaitHandle.

(Odziedziczone po WaitHandle)

Metody rozszerzania

Nazwa Opis
GetAccessControl(EventWaitHandle)

Zwraca deskryptory zabezpieczeń dla określonego handleelementu .

GetSafeWaitHandle(WaitHandle)

Pobiera bezpieczny uchwyt dla natywnego uchwytu oczekiwania systemu operacyjnego.

SetAccessControl(EventWaitHandle, EventWaitHandleSecurity)

Ustawia deskryptory zabezpieczeń dla określonego uchwytu oczekiwania zdarzeń.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Ustawia bezpieczny uchwyt dla natywnego uchwytu oczekiwania systemu operacyjnego.

Dotyczy

Bezpieczeństwo wątkowe

Ta klasa jest bezpieczna wątkiem.

Zobacz też