AutoResetEvent(Boolean) Конструктор

Определение

Инициализирует новый экземпляр класса AutoResetEvent логическим значением, показывающим наличие сигнального состояния.Initializes a new instance of the AutoResetEvent class with a Boolean value indicating whether to set the initial state to signaled.

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

Параметры

initialState
Boolean

Значение true для задания начального состояния сигнальным; false для задания несигнального начального состояния.true to set the initial state to signaled; false to set the initial state to non-signaled.

Примеры

В следующем примере используется AutoResetEvent для синхронизации действий двух потоков.The following example uses an AutoResetEvent to synchronize the activities of two threads. Первый поток, который является потоком приложения, выполняет Main.The first thread, which is the application thread, executes Main. Он записывает значения в защищенный ресурс, который является static (Shared в Visual Basic) с именем number.It writes values to the protected resource, which is a static (Shared in Visual Basic) field named number. Второй поток выполняет статический метод ThreadProc, который считывает значения, записанные Main.The second thread executes the static ThreadProc method, which reads the values written by Main.

Метод ThreadProc ожидает AutoResetEvent.The ThreadProc method waits for the AutoResetEvent. Когда Main вызывает метод Set на AutoResetEvent, метод ThreadProc считывает одно значение.When Main calls the Set method on the AutoResetEvent, the ThreadProc method reads one value. AutoResetEvent немедленно сбрасывается, поэтому метод ThreadProc снова ждет.The AutoResetEvent immediately resets, so the ThreadProc method waits again.

Логика программы гарантирует, что метод ThreadProc никогда не будет считывать одно и то же значение два раза.The program logic guarantees that the ThreadProc method will never read the same value two times. Это не гарантирует, что метод ThreadProc будет считывать каждое значение, записанное Main.It does not guarantee that the ThreadProc method will read every value written by Main. Это гарантирует необходимость второй блокировки AutoResetEvent.That guarantee would require a second AutoResetEvent lock.

После каждой операции записи Main выдает вызов метода Thread.Sleep, чтобы придать второму потоку возможность выполнить операцию.After each write operation, Main yields by calling the Thread.Sleep method, to give the second thread a chance to execute. В противном случае на компьютере с одним процессором Main будет записывать много значений между любыми двумя операциями чтения.Otherwise, on a single-processor computer Main would write many values between any two read operations.

using namespace System;
using namespace System::Threading;
ref class MyMainClass
{
public:
   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 );
      }
   }


   //Initially not signaled.
   static AutoResetEvent^ myResetEvent = gcnew AutoResetEvent( false );
   static int number;
   literal int numIterations = 100;
};

int main()
{
   
   //Create and start the reader thread.
   Thread^ myReaderThread = gcnew Thread( gcnew ThreadStart( MyMainClass::MyReadThreadProc ) );
   myReaderThread->Name = "ReaderThread";
   myReaderThread->Start();
   for ( int i = 1; i <= MyMainClass::numIterations; i++ )
   {
      Console::WriteLine( "Writer thread writing value: {0}", i );
      MyMainClass::number = i;
      
      //Signal that a value has been written.
      MyMainClass::myResetEvent->Set();
      
      //Give the Reader thread an opportunity to act.
      Thread::Sleep( 1 );

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

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

Применяется к

Дополнительно