Freigeben über


AutoResetEvent(Boolean) Konstruktor

Definition

Initialisiert eine neue Instanz der AutoResetEvent-Klasse mit einem booleschen Wert, der angibt, ob der anfängliche Zustand auf signalisiert festgelegt werden soll.

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

Parameter

initialState
Boolean

true, wenn der anfängliche Zustand auf signalisiert festgelegt werden soll. false, wenn der anfängliche Zustand auf nicht signalisiert festgelegt werden soll.

Beispiele

Im folgenden Beispiel wird ein AutoResetEvent verwendet, um die Aktivitäten von zwei Threads zu synchronisieren. Der erste Thread, bei dem es sich um den Anwendungsthread handelt, wird Mainausgeführt. Es schreibt Werte in die geschützte Ressource, bei der es sich um ein static Feld mit dem Namen (Shared in Visual Basic) handelt number. Der zweite Thread führt die statische ThreadProc Methode aus, die die von Maingeschriebenen Werte liest.

Die ThreadProc -Methode wartet auf .AutoResetEvent Wenn Main die Set -Methode für AutoResetEventaufruft, liest die ThreadProc -Methode einen Wert. Die AutoResetEvent wird sofort zurückgesetzt, sodass die ThreadProc Methode erneut wartet.

Die Programmlogik garantiert, dass die ThreadProc Methode nie denselben Wert zweimal liest. Es wird nicht garantiert, dass die ThreadProc -Methode jeden wert liest, der von geschrieben wurde Main. Diese Garantie erfordert eine zweite AutoResetEvent Sperre.

Nach jedem Schreibvorgang Main wird durch Aufrufen der Thread.Sleep -Methode ein Ergebnis erzielt, um dem zweiten Thread die Möglichkeit zu geben, ausgeführt zu werden. Andernfalls würden auf einem Einprozessorcomputer Main viele Werte zwischen zwei beliebigen Lesevorgängen geschrieben.

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

Gilt für:

Weitere Informationen