AutoResetEvent クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
通知を受けたときに、単一の待機中のスレッドを解放した後、自動的にリセットされるスレッドの同期イベントを表します。 このクラスは継承できません。
public ref class AutoResetEvent sealed : System::Threading::EventWaitHandle
public ref class AutoResetEvent sealed : System::Threading::WaitHandle
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
public sealed class AutoResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
type AutoResetEvent = class
inherit EventWaitHandle
type AutoResetEvent = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type AutoResetEvent = class
inherit EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits WaitHandle
- 継承
- 継承
- 継承
- 属性
例
次の例では、 を使用AutoResetEventして、ユーザーが Enter キーを押すたびに (基本クラスで) メソッドを呼び出Setして、一度に 1 つのスレッドを解放する方法を示します。 この例では、シグナル状態で作成された を AutoResetEvent 待機する 3 つのスレッドを開始します。 は既にシグナル状態であるため AutoResetEvent 、最初のスレッドはすぐに解放されます。 これにより、 AutoResetEvent が非シグナル状態にリセットされ、後続のスレッドがブロックされます。 ブロックされたスレッドは、ユーザーが Enter キーを押して一度に 1 つずつ解放するまで解放されません。
スレッドが最初 AutoResetEventの から解放された後、非シグナル状態で作成された別 AutoResetEvent の スレッドを待機します。 3 つのスレッドはすべてブロックされるため Set 、メソッドをすべて解放するには、 メソッドを 3 回呼び出す必要があります。
using namespace System;
using namespace System::Threading;
ref class Example
{
private:
static AutoResetEvent^ event_1 = gcnew AutoResetEvent(true);
static AutoResetEvent^ event_2 = gcnew AutoResetEvent(false);
static void ThreadProc()
{
String^ name = Thread::CurrentThread->Name;
Console::WriteLine("{0} waits on AutoResetEvent #1.", name);
event_1->WaitOne();
Console::WriteLine("{0} is released from AutoResetEvent #1.", name);
Console::WriteLine("{0} waits on AutoResetEvent #2.", name);
event_2->WaitOne();
Console::WriteLine("{0} is released from AutoResetEvent #2.", name);
Console::WriteLine("{0} ends.", name);
}
public:
static void Demo()
{
Console::WriteLine("Press Enter to create three threads and start them.\r\n" +
"The threads wait on AutoResetEvent #1, which was created\r\n" +
"in the signaled state, so the first thread is released.\r\n" +
"This puts AutoResetEvent #1 into the unsignaled state.");
Console::ReadLine();
for (int i = 1; i < 4; i++)
{
Thread^ t = gcnew Thread(gcnew ThreadStart(&ThreadProc));
t->Name = "Thread_" + i;
t->Start();
}
Thread::Sleep(250);
for (int i = 0; i < 2; i++)
{
Console::WriteLine("Press Enter to release another thread.");
Console::ReadLine();
event_1->Set();
Thread::Sleep(250);
}
Console::WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
for (int i = 0; i < 3; i++)
{
Console::WriteLine("Press Enter to release a thread.");
Console::ReadLine();
event_2->Set();
Thread::Sleep(250);
}
// Visual Studio: Uncomment the following line.
//Console::Readline();
}
};
void main()
{
Example::Demo();
}
/* This example produces output similar to the following:
Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.
Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.
Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.
Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.
All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.
Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.
Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.
Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
*/
using System;
using System.Threading;
// Visual Studio: Replace the default class in a Console project with
// the following class.
class Example
{
private static AutoResetEvent event_1 = new AutoResetEvent(true);
private static AutoResetEvent event_2 = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Press Enter to create three threads and start them.\r\n" +
"The threads wait on AutoResetEvent #1, which was created\r\n" +
"in the signaled state, so the first thread is released.\r\n" +
"This puts AutoResetEvent #1 into the unsignaled state.");
Console.ReadLine();
for (int i = 1; i < 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(250);
for (int i = 0; i < 2; i++)
{
Console.WriteLine("Press Enter to release another thread.");
Console.ReadLine();
event_1.Set();
Thread.Sleep(250);
}
Console.WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Press Enter to release a thread.");
Console.ReadLine();
event_2.Set();
Thread.Sleep(250);
}
// Visual Studio: Uncomment the following line.
//Console.Readline();
}
static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine("{0} waits on AutoResetEvent #1.", name);
event_1.WaitOne();
Console.WriteLine("{0} is released from AutoResetEvent #1.", name);
Console.WriteLine("{0} waits on AutoResetEvent #2.", name);
event_2.WaitOne();
Console.WriteLine("{0} is released from AutoResetEvent #2.", name);
Console.WriteLine("{0} ends.", name);
}
}
/* This example produces output similar to the following:
Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.
Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.
Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.
Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.
All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.
Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.
Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.
Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
*/
Imports System.Threading
' Visual Studio: Replace the default class in a Console project with
' the following class.
Class Example
Private Shared event_1 As New AutoResetEvent(True)
Private Shared event_2 As New AutoResetEvent(False)
<MTAThread()> _
Shared Sub Main()
Console.WriteLine("Press Enter to create three threads and start them." & vbCrLf & _
"The threads wait on AutoResetEvent #1, which was created" & vbCrLf & _
"in the signaled state, so the first thread is released." & vbCrLf & _
"This puts AutoResetEvent #1 into the unsignaled state.")
Console.ReadLine()
For i As Integer = 1 To 3
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next
Thread.Sleep(250)
For i As Integer = 1 To 2
Console.WriteLine("Press Enter to release another thread.")
Console.ReadLine()
event_1.Set()
Thread.Sleep(250)
Next
Console.WriteLine(vbCrLf & "All threads are now waiting on AutoResetEvent #2.")
For i As Integer = 1 To 3
Console.WriteLine("Press Enter to release a thread.")
Console.ReadLine()
event_2.Set()
Thread.Sleep(250)
Next
' Visual Studio: Uncomment the following line.
'Console.Readline()
End Sub
Shared Sub ThreadProc()
Dim name As String = Thread.CurrentThread.Name
Console.WriteLine("{0} waits on AutoResetEvent #1.", name)
event_1.WaitOne()
Console.WriteLine("{0} is released from AutoResetEvent #1.", name)
Console.WriteLine("{0} waits on AutoResetEvent #2.", name)
event_2.WaitOne()
Console.WriteLine("{0} is released from AutoResetEvent #2.", name)
Console.WriteLine("{0} ends.", name)
End Sub
End Class
' This example produces output similar to the following:
'
'Press Enter to create three threads and start them.
'The threads wait on AutoResetEvent #1, which was created
'in the signaled state, so the first thread is released.
'This puts AutoResetEvent #1 into the unsignaled state.
'
'Thread_1 waits on AutoResetEvent #1.
'Thread_1 is released from AutoResetEvent #1.
'Thread_1 waits on AutoResetEvent #2.
'Thread_3 waits on AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #1.
'Press Enter to release another thread.
'
'Thread_3 is released from AutoResetEvent #1.
'Thread_3 waits on AutoResetEvent #2.
'Press Enter to release another thread.
'
'Thread_2 is released from AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #2.
'
'All threads are now waiting on AutoResetEvent #2.
'Press Enter to release a thread.
'
'Thread_2 is released from AutoResetEvent #2.
'Thread_2 ends.
'Press Enter to release a thread.
'
'Thread_1 is released from AutoResetEvent #2.
'Thread_1 ends.
'Press Enter to release a thread.
'
'Thread_3 is released from AutoResetEvent #2.
'Thread_3 ends.
注釈
スレッドの相互作用 (またはスレッド シグナリング) には、ManualResetEventおよび EventWaitHandle を使用AutoResetEvent
します。 詳細については、同期プリミティブの概要に関する記事の スレッド操作またはシグナル通知 に 関するセクションを 参照してください。
重要
この型は IDisposable インターフェイスを実装します。 型の使用が完了したら、直接的または間接的に型を破棄する必要があります。 直接的に型を破棄するには、try
/catch
ブロック内で Dispose メソッドを呼び出します。 間接的に型を破棄するには、using
(C# の場合) または Using
(Visual Basic 言語) などの言語構成要素を使用します。 詳細については、IDisposable インターフェイスに関するトピック内の「IDisposable を実装するオブジェクトの使用」セクションを参照してください。
スレッドは 、AutoResetEvent.WaitOne を呼び出してシグナルを待機します。 AutoResetEvent
が非シグナル状態の場合、スレッドは AutoResetEvent.Set が呼び出されるまでブロックします。
待機中のAutoResetEvent
スレッドを解放するためのシグナルを呼び出Set
します。 AutoResetEvent
は、1 つの待機中のスレッドが解放されるまでシグナル状態のままになり、自動的に非シグナル状態に戻ります。 待機しているスレッドがない場合、状態は無期限にシグナル状態のままです。
がシグナル状態の間AutoResetEventにスレッドがを呼び出WaitOneした場合、スレッドはブロックしません。 は AutoResetEvent スレッドを直ちに解放し、非シグナル状態に戻ります。
重要
メソッドを呼び出すたびにスレッドが Set 解放される保証はありません。 2 つの呼び出しが近すぎるため、スレッドが解放される前に 2 回目の呼び出しが行われると、1 つのスレッドのみが解放されます。 2 回目の呼び出しが行われなかったかのように表示されます。 また、待機しているスレッドがなく、 が既にAutoResetEventシグナル通知されている場合に が呼び出された場合Set、呼び出しは無効になります。
の初期状態 AutoResetEvent
を制御するには、ブール値をコンストラクターに渡します true
。初期状態が通知される場合は 、 false
それ以外の場合は 。
AutoResetEvent
および メソッドと共にstatic
WaitAllWaitAny使用することもできます。
.NET Framework バージョン 2.0 以降では、 AutoResetEvent は新しいEventWaitHandleクラスから派生します。 AutoResetEventは、 でEventResetMode.AutoReset作成された とEventWaitHandle機能的に同じです。
Note
AutoResetEventクラスとは異なり、 クラスはEventWaitHandle名前付きシステム同期イベントへのアクセスを提供します。
コンストラクター
AutoResetEvent(Boolean) |
初期状態をシグナル状態に設定するかどうかを示す Boolean 型の値を使用して、AutoResetEvent クラスの新しいインスタンスを初期化します。 |
フィールド
WaitTimeout |
待機ハンドルがシグナル状態になる前に WaitAny(WaitHandle[], Int32, Boolean) 操作がタイムアウトになったことを示します。 このフィールドは定数です。 (継承元 WaitHandle) |
プロパティ
Handle |
互換性のために残されています。
互換性のために残されています。
ネイティブ オペレーティング システム ハンドルを取得または設定します。 (継承元 WaitHandle) |
SafeWaitHandle |
ネイティブ オペレーティング システム ハンドルを取得または設定します。 (継承元 WaitHandle) |
メソッド
Close() |
現在の WaitHandle によって保持されているすべてのリソースを解放します。 (継承元 WaitHandle) |
CreateObjRef(Type) |
リモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。 (継承元 MarshalByRefObject) |
Dispose() |
WaitHandle クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 (継承元 WaitHandle) |
Dispose(Boolean) |
派生クラスでオーバーライドされると、WaitHandle によって使用されているアンマネージド リソースを解放し、オプションでマネージド リソースも解放します。 (継承元 WaitHandle) |
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetAccessControl() |
現在の EventWaitHandle オブジェクトによって表される名前付きシステム イベントのアクセス制御セキュリティを表す EventWaitHandleSecurity オブジェクトを取得します。 (継承元 EventWaitHandle) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetLifetimeService() |
互換性のために残されています。
対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。 (継承元 MarshalByRefObject) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
InitializeLifetimeService() |
互換性のために残されています。
このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。 (継承元 MarshalByRefObject) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
MemberwiseClone(Boolean) |
現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。 (継承元 MarshalByRefObject) |
Reset() |
イベントの状態を非シグナル状態に設定し、スレッドをブロックします。 |
Reset() |
イベントの状態を非シグナル状態に設定し、スレッドをブロックします。 (継承元 EventWaitHandle) |
Set() |
イベントの状態をシグナル状態に設定し、待機している最大で 1 つのスレッドが進行できるようにします。 |
Set() |
イベントの状態をシグナル状態に設定し、待機している 1 つ以上のスレッドが進行できるようにします。 (継承元 EventWaitHandle) |
SetAccessControl(EventWaitHandleSecurity) |
名前付きシステム イベントのアクセス制御セキュリティを設定します。 (継承元 EventWaitHandle) |
ToString() |
現在のオブジェクトを表す文字列を返します。 (継承元 Object) |
WaitOne() |
現在の WaitHandle がシグナルを受け取るまで、現在のスレッドをブロックします。 (継承元 WaitHandle) |
WaitOne(Int32) |
32 ビット符号付き整数を使用して時間間隔をミリ秒単位で指定し、現在の WaitHandle がシグナルを受信するまで、現在のスレッドをブロックします。 (継承元 WaitHandle) |
WaitOne(Int32, Boolean) |
現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします。時間間隔を指定するために 32 ビット符号付き整数を使用し、待機の前でも同期ドメインを終了するかどうかを指定します。 (継承元 WaitHandle) |
WaitOne(TimeSpan) |
TimeSpan を使用して時間間隔を指定し、現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックします。 (継承元 WaitHandle) |
WaitOne(TimeSpan, Boolean) |
現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックします。TimeSpan を使用して時間間隔を指定し、待機の前でも同期ドメインを終了するかどうかを指定します。 (継承元 WaitHandle) |
明示的なインターフェイスの実装
IDisposable.Dispose() |
この API は製品インフラストラクチャをサポートします。コードから直接使用するものではありません。 WaitHandle によって使用されているすべてのリソースを解放します。 (継承元 WaitHandle) |
拡張メソッド
GetAccessControl(EventWaitHandle) |
指定した |
SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
指定したイベント待機ハンドルのセキュリティ記述子を設定します。 |
GetSafeWaitHandle(WaitHandle) |
ネイティブ オペレーティング システムの待機ハンドルのためのセーフ ハンドルを取得します。 |
SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
ネイティブ オペレーティング システムの待機ハンドルのためのセーフ ハンドルを設定します。 |
適用対象
スレッド セーフ
このクラスはスレッド セーフです。