次の方法で共有


AutoResetEvent(Boolean) コンストラクター

定義

初期状態をシグナル状態に設定するかどうかを示す 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 使用して 2 つのスレッドのアクティビティを同期します。 最初のスレッド (アプリケーション スレッド) は を実行します Main。 これは、 という名前numberの (SharedVisual Basic では) フィールドであるstatic、保護されたリソースに値を書き込みます。 2 番目のスレッドは、 によって書き込まれた値を読み取る静的 ThreadProc メソッドを Main実行します。

メソッドは ThreadProc を待機します AutoResetEvent。 で メソッドをSet呼び出すとMainAutoResetEventメソッドは 1 つの値をThreadProc読み取ります。 は AutoResetEvent 直ちにリセットされるため、メソッドは ThreadProc もう一度待機します。

プログラム ロジックでは、メソッドが同じ値を ThreadProc 2 回読み取ることは決してないことを保証します。 メソッドが によってMain書き込まれたすべての値をThreadProc読み取る保証はありません。 その保証には 2 つ目 AutoResetEvent のロックが必要です。

各書き込み操作の後、 Main メソッドを Thread.Sleep 呼び出して生成し、2 番目のスレッドに実行する機会を与えます。 それ以外の場合、単一プロセッサ コンピューター Main では、2 つの読み取り操作の間に多くの値が書き込まれます。

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

適用対象

こちらもご覧ください