C# の ManualResetEvent の仕組みと使用方法

ManualResetEvent は複数のスレッドの実行順番を制御するために利用する C# のスレッド同期クラスです。

ManualResetEventはセット状態と非セット状態の2つの状態を持ちます。デフォルトでは、ManualResetEventは非セット状態です。スレッドは、ManualResetEventのSet()メソッドを呼び出してその状態をセット状態にすることも、Reset()メソッドを呼び出して非セット状態にすることもできます。

ManualResetEventには、2つの主要なメソッドとしてWaitOne()とSet()があります。WaitOne()メソッドは、ManualResetEventの状態がセット状態になるまで、現在スレッドをブロックするために使用されます。Set()メソッドはManualResetEventの状態をセット状態に設定し、待機中のスレッドの実行を許可するために使用されます。

以下に、ManualResetEvent の例を示します。

using System;
using System.Threading;
class Program
{
static ManualResetEvent manualEvent = new ManualResetEvent(false);
static void Main()
{
// 创建两个线程
Thread t1 = new Thread(DoWork);
t1.Start();
Thread t2 = new Thread(DoWork);
t2.Start();
// 执行一些其他操作
// 等待一段时间后,将 ManualResetEvent 的状态设置为设置状态,使得等待中的线程可以继续执行
Thread.Sleep(2000);
manualEvent.Set();
// 等待两个线程执行完毕
t1.Join();
t2.Join();
Console.WriteLine("All threads have finished.");
}
static void DoWork()
{
Console.WriteLine("Thread {0} is waiting.", Thread.CurrentThread.ManagedThreadId);
// 阻塞当前线程,直到 ManualResetEvent 的状态为设置状态
manualEvent.WaitOne();
Console.WriteLine("Thread {0} continues.", Thread.CurrentThread.ManagedThreadId);
}
}

上記の例では、DoWork()メソッドを実行する2つのスレッド、t1とt2を作成しました。DoWork()メソッドでは、まず現在のスレッドのIDを出力し、manualEventのWaitOne()メソッドを呼び出してスレッドをブロックします。その後、メインスレッドで一定時間待機してから、manualEventのSet()メソッドを呼び出して状態をセット状態に設定し、待機中のスレッドが実行を再開できるようにしました。最後に、t1.Join()メソッドとt2.Join()メソッドを使用して2つのスレッドの実行が完了するのを待ちました。

この例で分かるように、`ManualResetEvent` は、特定の条件が満たされるのを待つ必要がある場合に `WaitOne()` メソッドを呼び出してスレッドをブロックし、待機中のスレッドを `Set()` メソッドの呼び出しによってウェイクアップさせることで使用できます。これにより、複数のスレッドの実行順序を制御できます。

コメントを残す 0

Your email address will not be published. Required fields are marked *


广告
広告は10秒後に閉じます。
bannerAds