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

Определение

Инициализирует новый экземпляр AutoResetEvent класса с логическим значением, указывающим, следует ли задать начальное состояние для сигнала.

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 Значение , чтобы задать начальное состояние не сигнальным.

Примеры

В следующем примере используется AutoResetEvent для синхронизации действий двух потоков. Первый поток, который является потоком приложения, выполняется Main. Он записывает значения в защищенный ресурс, который представляет собой поле static (Shared в Visual Basic) с именем number. Второй поток выполняет статический ThreadProc метод, который считывает значения, записанные Mainна .

Метод ThreadProc ожидает.AutoResetEvent При Main вызове метода в SetAutoResetEventметоде ThreadProc метод считывает одно значение. Немедленно AutoResetEvent сбрасывается, поэтому ThreadProc метод снова ожидает.

Логика программы гарантирует, что ThreadProc метод никогда не будет читать одно и то же значение два раза. Это не гарантирует, что ThreadProc метод будет считывать каждое значение, написанное Mainна . Для этой гарантии потребуется вторая AutoResetEvent блокировка.

После каждой операции Main записи возвращается Thread.Sleep вызов метода, чтобы дать второй поток возможность выполнить. В противном случае на компьютере Main с одним процессором будет записываться много значений между двумя операциями чтения.

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

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

См. также раздел