AutoResetEvent(Boolean) Konstruktor

Definition

Initierar en ny instans av AutoResetEvent klassen med ett booleskt värde som anger om det ursprungliga tillståndet ska anges till signalerat.

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

Parametrar

initialState
Boolean

true för att ange det initiala tillståndet till signalerat; false för att ange det initiala tillståndet till icke-signalerat.

Exempel

I följande exempel används en AutoResetEvent för att synkronisera aktiviteterna i två trådar. Den första tråden, som är programtråden, kör Main. Den skriver värden till den skyddade resursen, vilket är ett static -fält (Shared i Visual Basic) med namnet number. Den andra tråden kör den statiska ThreadProc metoden, som läser värdena som skrivits av Main.

Metoden ThreadProc väntar på AutoResetEvent. När Main anropar Set metoden på AutoResetEventThreadProc läser metoden ett värde. Omedelbart AutoResetEvent återställs, så ThreadProc metoden väntar igen.

Programlogik garanterar att ThreadProc metoden aldrig läser samma värde två gånger. Det garanterar inte att metoden läser varje värde som ThreadProc skrivs av Main. Den garantin skulle kräva ett andra AutoResetEvent lås.

Efter varje skrivåtgärd Main ger det genom att anropa Thread.Sleep metoden för att ge den andra tråden en chans att köra. Annars skulle en dator Main med en processor skriva många värden mellan två läsåtgärder.

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

Gäller för

Se även