AutoResetEvent(Boolean) 建構函式
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
使用布林值 (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
名為 的 Visual Basic) 欄位中 number
的 (Shared
。 第二個執行緒會執行靜態 ThreadProc
方法,以讀取 所 Main
寫入的值。
方法 ThreadProc
會 AutoResetEvent 等候 。 在 上 AutoResetEvent 呼叫 Set 方法時 Main
, ThreadProc
方法會讀取一個值。
AutoResetEvent會立即重設,因此方法 ThreadProc
會再次等候。
程式邏輯保證 ThreadProc
方法永遠不會讀取相同的值兩次。 不保證 ThreadProc
方法會讀取 所 Main
寫入的每個值。 該保證需要第二 AutoResetEvent 個鎖定。
在每個寫入作業之後, Main
呼叫 Thread.Sleep 方法會產生 ,讓第二個執行緒有機會執行。 否則,在單處理器電腦上 Main
,會在任兩個讀取作業之間寫入許多值。
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