AutoResetEvent(Boolean) Constructor

Definición

Inicializa una nueva instancia de la AutoResetEvent clase con un valor booleano que indica si se debe establecer el estado inicial en señalizado.

public:
 AutoResetEvent(bool initialState);
public AutoResetEvent(bool initialState);
new System.Threading.AutoResetEvent : bool -> System.Threading.AutoResetEvent
Public Sub New (initialState As Boolean)

Parámetros

initialState
Boolean

true para establecer el estado inicial en señalizado; false para establecer el estado inicial en no señalizado.

Ejemplos

En el ejemplo siguiente se usa para AutoResetEvent sincronizar las actividades de dos subprocesos. El primer subproceso, que es el subproceso de la aplicación, ejecuta Main. Escribe valores en el recurso protegido, que es un campo static (Shared en Visual Basic) denominado number. El segundo subproceso ejecuta el método estático ThreadProc , que lee los valores escritos por Main.

El ThreadProc método espera a .AutoResetEvent Cuando Main llama al Set método en AutoResetEvent, el ThreadProc método lee un valor. Se AutoResetEvent restablece inmediatamente, por lo que el ThreadProc método espera de nuevo.

La lógica del programa garantiza que el ThreadProc método nunca leerá el mismo valor dos veces. No garantiza que el ThreadProc método lea todos los valores escritos por Main. Esa garantía requeriría un segundo AutoResetEvent bloqueo.

Después de cada operación de escritura, Main produce una llamada al Thread.Sleep método para dar al segundo subproceso una oportunidad de ejecutarse. De lo contrario, en un equipo Main de un solo procesador escribiría muchos valores entre dos operaciones de lectura.

using System;
using System.Threading;

namespace AutoResetEvent_Examples
{
    class MyMainClass
    {
        //Initially not signaled.
      const int numIterations = 100;
      static AutoResetEvent myResetEvent = new AutoResetEvent(false);
      static int number;
      
      static void Main()
        {
         //Create and start the reader thread.
         Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc));
         myReaderThread.Name = "ReaderThread";
         myReaderThread.Start();

         for(int i = 1; i <= numIterations; i++)
         {
            Console.WriteLine("Writer thread writing value: {0}", i);
            number = i;
            
            //Signal that a value has been written.
            myResetEvent.Set();
            
            //Give the Reader thread an opportunity to act.
            Thread.Sleep(1);
         }

         //Terminate the reader thread.
         myReaderThread.Abort();
      }

      static void MyReadThreadProc()
      {
         while(true)
         {
            //The value will not be read until the writer has written
            // at least once since the last read.
            myResetEvent.WaitOne();
            Console.WriteLine("{0} reading value: {1}", Thread.CurrentThread.Name, number);
         }
      }
    }
}
Imports System.Threading

Namespace AutoResetEvent_Examples
    Class MyMainClass
        'Initially not signaled.
        Private Const numIterations As Integer = 100
        Private Shared myResetEvent As New AutoResetEvent(False)
        Private Shared number As Integer

        <MTAThread> _
        Shared Sub Main()
            'Create and start the reader thread.
            Dim myReaderThread As New Thread(AddressOf MyReadThreadProc)
            myReaderThread.Name = "ReaderThread"
            myReaderThread.Start()

            Dim i As Integer
            For i = 1 To numIterations
                Console.WriteLine("Writer thread writing value: {0}", i)
                number = i

                'Signal that a value has been written.
                myResetEvent.Set()

                'Give the Reader thread an opportunity to act.
                Thread.Sleep(1)
            Next i

            'Terminate the reader thread.
            myReaderThread.Abort()
        End Sub

        Shared Sub MyReadThreadProc()
            While True
                'The value will not be read until the writer has written
                ' at least once since the last read.
                myResetEvent.WaitOne()
                Console.WriteLine("{0} reading value: {1}", Thread.CurrentThread.Name, number)
            End While
        End Sub
    End Class
End Namespace 'AutoResetEvent_Examples

Se aplica a

Consulte también