C#でのManualResetEventの理解と使用
ManualResetEvent は、スレッド同期のためのクラスであり、1つまたは複数のスレッドが特定のイベントが発生するまで待機できるようにします。それには2つの状態があります:トリガーされた状態と未トリガーの状態があります。イベントが未トリガーの状態にある場合、すべての待機中のスレッドはブロックされ、イベントが手動でトリガーされるまで待機します。イベントがトリガーされた状態にある場合、待機中のスレッドが起こされ、処理が続行します。
以下はManualResetEventの主要なメソッドとプロパティです:
- Set():イベント状態をトリガーされたと設定し、すべての待機スレッドを起こす。
- Reset():イベントの状態を未発生にリセットします。
- WaitOne()メソッドは、イベントの発生を待機し、イベントが発生している場合はすぐに戻ります。そうでない場合は、スレッドはイベントが発生するまでブロックされます。
- WaitOne(timeout):イベントの発生を待機し、イベントがすでに発生している場合はすぐに戻ります。そうでない場合、スレッドはイベントが発生するまでブロックされ、またはタイムアウトします。
以下はManualResetEventを使用した例です。
using System;
using System.Threading;
class Program
{
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread thread1 = new Thread(Work);
Thread thread2 = new Thread(Work);
thread1.Start();
thread2.Start();
// 等待一段时间
Thread.Sleep(2000);
// 触发事件,唤醒等待的线程
manualResetEvent.Set();
// 等待线程执行完毕
thread1.Join();
thread2.Join();
Console.WriteLine("All threads completed.");
Console.ReadLine();
}
static void Work()
{
Console.WriteLine("Thread {0} waiting.", Thread.CurrentThread.ManagedThreadId);
// 等待事件的触发
manualResetEvent.WaitOne();
Console.WriteLine("Thread {0} resumed.", Thread.CurrentThread.ManagedThreadId);
}
}
上記の例では、thread1とthread2という2つの作業スレッドを作成し、それらがmanualResetEventイベントが発生するのを待機させました。メインスレッドでは、2秒待機した後、手動でmanualResetEventイベントを発生させました。このようにして、2つの作業スレッドが起こされ、続行され、最終的に”All threads completed.”という結果が出力されます。
ManualResetEventは、マルチスレッドプログラミングに非常に役立ち、スレッド間の同期と調整を実現できます。注意すべき点は、一度ManualResetEventがトリガーされると、Reset()メソッドが呼び出されるまで常にトリガーされた状態を維持することです。