AutoResetEvent クラス
アセンブリ: mscorlib (mscorlib.dll 内)


![]() |
---|
このクラスに適用される HostProtectionAttribute 属性の Resources プロパティの値は、Synchronization または ExternalThreading です。HostProtectionAttribute は、デスクトップ アプリケーション (一般的には、アイコンをダブルクリック、コマンドを入力、またはブラウザに URL を入力して起動するアプリケーション) には影響しません。詳細については、HostProtectionAttribute クラスのトピックまたは「SQL Server プログラミングとホスト保護属性」を参照してください。 |
.NET Framework Version 2.0 では、AutoResetEvent は新しい EventWaitHandle クラスから派生します。AutoResetEvent は、機能的には EventResetMode.AutoReset で作成した EventWaitHandle と同等です。
AutoResetEvent を使用すると、スレッドはシグナルを通じて相互に通信できます。通常、このような通信は、複数のスレッドが 1 つのリソースに対して排他的なアクセスを必要とする場合に使用します。
スレッドは AutoResetEvent の WaitOne を呼び出すことによってシグナルを待機します。AutoResetEvent が非シグナル状態の場合、スレッドはブロックし、リソースを現在制御しているスレッドが Set を呼び出すことによってリソースが使用可能になったことをシグナル通知するまで待機します。
Set を呼び出すと、AutoResetEvent にシグナルが送られ、待機しているスレッドが解放されます。AutoResetEvent は、待機している最後のスレッドが解放されるまでシグナル状態のままとなり、最後のスレッドが解放されると自動的に非シグナル状態に戻ります。待機中のスレッドがない場合、状態は無限にシグナル状態のままです。
AutoResetEvent の初期状態は、コンストラクタに Boolean 値を渡すことによって制御できます。初期状態をシグナル状態にする場合は true を渡し、それ以外の場合は false を渡します。
AutoResetEvent は、staticWaitAll メソッドおよび WaitAny メソッドでも使用できます。

待機ハンドルを使用して、複雑な数値計算の各段階の完了をシグナル通知する例を次に示します。計算の形式は、result = first term + second term + third term です。各項目には、事前計算と、算出された基数を使用した最終計算が行われます。
Imports System Imports System.Threading Public Class CalculateTest <MTAThreadAttribute> _ Shared Sub Main() Dim calc As New Calculate() Console.WriteLine("Result = {0}.", _ calc.Result(234).ToString()) Console.WriteLine("Result = {0}.", _ calc.Result(55).ToString()) End Sub End Class Public Class Calculate Dim baseNumber, firstTerm, secondTerm, thirdTerm As Double Dim autoEvents() As AutoResetEvent Dim manualEvent As ManualResetEvent ' Generate random numbers to simulate the actual calculations. Dim randomGenerator As Random Sub New() autoEvents = New AutoResetEvent(2) { _ New AutoResetEvent(False), _ New AutoResetEvent(False), _ New AutoResetEvent(False) } manualEvent = New ManualResetEvent(False) End Sub Private Sub CalculateBase(stateInfo As Object) baseNumber = randomGenerator.NextDouble() ' Signal that baseNumber is ready. manualEvent.Set() End Sub ' The following CalculateX methods all perform the same ' series of steps as commented in CalculateFirstTerm. Private Sub CalculateFirstTerm(stateInfo As Object) ' Perform a precalculation. Dim preCalc As Double = randomGenerator.NextDouble() ' Wait for baseNumber to be calculated. manualEvent.WaitOne() ' Calculate the first term from preCalc and baseNumber. firstTerm = preCalc * baseNumber * _ randomGenerator.NextDouble() ' Signal that the calculation is finished. autoEvents(0).Set() End Sub Private Sub CalculateSecondTerm(stateInfo As Object) Dim preCalc As Double = randomGenerator.NextDouble() manualEvent.WaitOne() secondTerm = preCalc * baseNumber * _ randomGenerator.NextDouble() autoEvents(1).Set() End Sub Private Sub CalculateThirdTerm(stateInfo As Object) Dim preCalc As Double = randomGenerator.NextDouble() manualEvent.WaitOne() thirdTerm = preCalc * baseNumber * _ randomGenerator.NextDouble() autoEvents(2).Set() End Sub Function Result(seed As Integer) As Double randomGenerator = New Random(seed) ' Simultaneously calculate the terms. ThreadPool.QueueUserWorkItem(AddressOf CalculateBase) ThreadPool.QueueUserWorkItem(AddressOf CalculateFirstTerm) ThreadPool.QueueUserWorkItem(AddressOf CalculateSecondTerm) ThreadPool.QueueUserWorkItem(AddressOf CalculateThirdTerm) ' Wait for all of the terms to be calculated. WaitHandle.WaitAll(autoEvents) ' Reset the wait handle for the next calculation. manualEvent.Reset() Return firstTerm + secondTerm + thirdTerm End Function End Class
using System; using System.Threading; class CalculateTest { static void Main() { Calculate calc = new Calculate(); Console.WriteLine("Result = {0}.", calc.Result(234).ToString()); Console.WriteLine("Result = {0}.", calc.Result(55).ToString()); } } class Calculate { double baseNumber, firstTerm, secondTerm, thirdTerm; AutoResetEvent[] autoEvents; ManualResetEvent manualEvent; // Generate random numbers to simulate the actual calculations. Random randomGenerator; public Calculate() { autoEvents = new AutoResetEvent[] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) }; manualEvent = new ManualResetEvent(false); } void CalculateBase(object stateInfo) { baseNumber = randomGenerator.NextDouble(); // Signal that baseNumber is ready. manualEvent.Set(); } // The following CalculateX methods all perform the same // series of steps as commented in CalculateFirstTerm. void CalculateFirstTerm(object stateInfo) { // Perform a precalculation. double preCalc = randomGenerator.NextDouble(); // Wait for baseNumber to be calculated. manualEvent.WaitOne(); // Calculate the first term from preCalc and baseNumber. firstTerm = preCalc * baseNumber * randomGenerator.NextDouble(); // Signal that the calculation is finished. autoEvents[0].Set(); } void CalculateSecondTerm(object stateInfo) { double preCalc = randomGenerator.NextDouble(); manualEvent.WaitOne(); secondTerm = preCalc * baseNumber * randomGenerator.NextDouble(); autoEvents[1].Set(); } void CalculateThirdTerm(object stateInfo) { double preCalc = randomGenerator.NextDouble(); manualEvent.WaitOne(); thirdTerm = preCalc * baseNumber * randomGenerator.NextDouble(); autoEvents[2].Set(); } public double Result(int seed) { randomGenerator = new Random(seed); // Simultaneously calculate the terms. ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateBase)); ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateFirstTerm)); ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateSecondTerm)); ThreadPool.QueueUserWorkItem( new WaitCallback(CalculateThirdTerm)); // Wait for all of the terms to be calculated. WaitHandle.WaitAll(autoEvents); // Reset the wait handle for the next calculation. manualEvent.Reset(); return firstTerm + secondTerm + thirdTerm; } }
using namespace System; using namespace System::Threading; ref class Calculate { private: double baseNumber; double firstTerm; double secondTerm; double thirdTerm; array<AutoResetEvent^>^autoEvents; ManualResetEvent^ manualEvent; // Generate random numbers to simulate the actual calculations. Random^ randomGenerator; public: Calculate() { autoEvents = gcnew array<AutoResetEvent^>(3); autoEvents[ 0 ] = gcnew AutoResetEvent( false ); autoEvents[ 1 ] = gcnew AutoResetEvent( false ); autoEvents[ 2 ] = gcnew AutoResetEvent( false ); manualEvent = gcnew ManualResetEvent( false ); } private: void CalculateBase( Object^ /*stateInfo*/ ) { baseNumber = randomGenerator->NextDouble(); // Signal that baseNumber is ready. manualEvent->Set(); } // The following CalculateX methods all perform the same // series of steps as commented in CalculateFirstTerm. void CalculateFirstTerm( Object^ /*stateInfo*/ ) { // Perform a precalculation. double preCalc = randomGenerator->NextDouble(); // Wait for baseNumber to be calculated. manualEvent->WaitOne(); // Calculate the first term from preCalc and baseNumber. firstTerm = preCalc * baseNumber * randomGenerator->NextDouble(); // Signal that the calculation is finished. autoEvents[ 0 ]->Set(); } void CalculateSecondTerm( Object^ /*stateInfo*/ ) { double preCalc = randomGenerator->NextDouble(); manualEvent->WaitOne(); secondTerm = preCalc * baseNumber * randomGenerator->NextDouble(); autoEvents[ 1 ]->Set(); } void CalculateThirdTerm( Object^ /*stateInfo*/ ) { double preCalc = randomGenerator->NextDouble(); manualEvent->WaitOne(); thirdTerm = preCalc * baseNumber * randomGenerator->NextDouble(); autoEvents[ 2 ]->Set(); } public: double Result( int seed ) { randomGenerator = gcnew Random( seed ); // Simultaneously calculate the terms. ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Calculate::CalculateBase ) ); ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Calculate::CalculateFirstTerm ) ); ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Calculate::CalculateSecondTerm ) ); ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Calculate::CalculateThirdTerm ) ); // Wait for all of the terms to be calculated. WaitHandle::WaitAll( autoEvents ); // Reset the wait handle for the next calculation. manualEvent->Reset(); return firstTerm + secondTerm + thirdTerm; } }; int main() { Calculate^ calc = gcnew Calculate; Console::WriteLine( "Result = {0}.", calc->Result( 234 ).ToString() ); Console::WriteLine( "Result = {0}.", calc->Result( 55 ).ToString() ); }
import System.*; import System.Threading.*; class CalculateTest { public static void main(String[] args) { Calculate calc = new Calculate(); Console.WriteLine("Result = {0}.", String.valueOf(calc.Result(234))); Console.WriteLine("Result = {0}.", String.valueOf(calc.Result(55))); } //main } //CalculateTest class Calculate { private double baseNumber, firstTerm, secondTerm, thirdTerm; private AutoResetEvent autoEvents[]; private ManualResetEvent manualEvent; // Generate random numbers to simulate the actual calculations. private Random randomGenerator; public Calculate() { autoEvents = new AutoResetEvent[] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) }; manualEvent = new ManualResetEvent(false); } //Calculate void CalculateBase(Object stateInfo) { baseNumber = randomGenerator.NextDouble(); // Signal that baseNumber is ready. manualEvent.Set(); } //CalculateBase // The following CalculateX methods all perform the same // series of steps as commented in CalculateFirstTerm. void CalculateFirstTerm(Object stateInfo) { // Perform a precalculation. double preCalc = randomGenerator.NextDouble(); // Wait for baseNumber to be calculated. manualEvent.WaitOne(); // Calculate the first term from preCalc and baseNumber. firstTerm = preCalc * baseNumber * randomGenerator.NextDouble(); // Signal that the calculation is finished. autoEvents[0].Set(); } //CalculateFirstTerm void CalculateSecondTerm(Object stateInfo) { double preCalc = randomGenerator.NextDouble(); manualEvent.WaitOne(); secondTerm = preCalc * baseNumber * randomGenerator.NextDouble(); autoEvents[1].Set(); } //CalculateSecondTerm void CalculateThirdTerm(Object stateInfo) { double preCalc = randomGenerator.NextDouble(); manualEvent.WaitOne(); thirdTerm = preCalc * baseNumber * randomGenerator.NextDouble(); autoEvents[2].Set(); } //CalculateThirdTerm public double Result(int seed) { randomGenerator = new Random(seed); // Simultaneously calculate the terms. ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateBase)); ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateFirstTerm)); ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateSecondTerm)); ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateThirdTerm)); // Wait for all of the terms to be calculated. WaitHandle.WaitAll(autoEvents); // Reset the wait handle for the next calculation. manualEvent.Reset(); return firstTerm + secondTerm + thirdTerm; } //Result } //Calculate

System.MarshalByRefObject
System.Threading.WaitHandle
System.Threading.EventWaitHandle
System.Threading.AutoResetEvent


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


AutoResetEvent コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)


Imports System 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(0) Next i 'Terminate the reader thread. myReaderThread.Abort() End Sub 'Main 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 'MyReadThreadProc End Class 'MyMainClass End Namespace 'AutoResetEvent_Examples
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(0); } //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); } } } }
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( 0 ); } //Terminate the reader thread. myReaderThread->Abort(); }
package AutoResetEvent_Examples; import System.*; import System.Threading.*; import System.Threading.Thread; class MyMainClass { //Initially not signaled. private final static int numIterations = 100; private static AutoResetEvent myResetEvent = new AutoResetEvent(false); private static int number; public static void main(String[] args) { //Create and start the reader thread. Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc)); myReaderThread.set_Name("ReaderThread"); myReaderThread.Start(); for (int i = 1; i <= numIterations; i++) { Console.WriteLine("Writer thread writing value: {0}", String.valueOf(i)); number = i; //Signal that a value has been written. myResetEvent.Set(); //Give the Reader thread an opportunity to act. Thread.Sleep(0); } //Terminate the reader thread. myReaderThread.Abort(); } //main 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.get_CurrentThread().get_Name(),String.valueOf(number)); } } //MyReadThreadProc } //MyMainClass

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


AutoResetEvent プロパティ

名前 | 説明 | |
---|---|---|
![]() | Handle | ネイティブ オペレーティング システム ハンドルを取得または設定します。 ( WaitHandle から継承されます。) |
![]() | SafeWaitHandle | ネイティブ オペレーティング システム ハンドルを取得または設定します。 ( WaitHandle から継承されます。) |

AutoResetEvent メソッド


AutoResetEvent メンバ
イベントが発生したことを待機中のスレッドに通知します。このクラスは継承できません。
AutoResetEvent データ型で公開されるメンバを以下の表に示します。


名前 | 説明 | |
---|---|---|
![]() | Handle | ネイティブ オペレーティング システム ハンドルを取得または設定します。(WaitHandle から継承されます。) |
![]() | SafeWaitHandle | ネイティブ オペレーティング システム ハンドルを取得または設定します。(WaitHandle から継承されます。) |


- AutoResetEventのページへのリンク