AutoResetEvent(Boolean) Konstruktor
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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