AutoResetEventクラスは、WaitHandleクラスのサブクラスとなっています。
同じような機能を持つクラスとしてManualResetEventがありますが、こちらは
以下のような特徴を持っています。
待機中のスレッドがいなくなった時点で、自動的に非シグナル状態に戻る
なので、ManualResetEventと違いSet,Resetを交互に呼ぶ必要がありません。
マルチスレッド処理で、特定のスレッド同士を待ち合わせたりする際によく
利用します。
初期状態のシグナル状態の設定は、コンストラクタにて指定します。
trueを渡すと初期シグナル状態となり、falseを渡すと初期非シグナル状態となります。
以下サンプルです。
// vim:set ts=4 sw=4 et ws is nowrap ft=cs: using System; using System.Threading; namespace Gsf.Samples.Tmp{ public class AutoResetEventSample01 : IExecutor{ // <summary> // 初期状態は非シグナル状態(ブロック状態). // </summary> private AutoResetEvent _are = new AutoResetEvent(false); public void Execute(){ // // 2秒間待機し、その後waithandleをシグナルにするコールバックを作成. // WaitCallback callback = x => { Thread.Sleep(TimeSpan.FromSeconds(2.0)); _are.Set(); }; ThreadPool.QueueUserWorkItem(callback); Console.Write("waitone....."); _are.WaitOne(); Console.WriteLine("done."); ////////////////////////////////////////////////////////////////////////////////////////////// // この時点で待機中のスレッドがいなくなるので、AutoResetEventは自動的に非シグナル状態に戻る. ////////////////////////////////////////////////////////////////////////////////////////////// ThreadPool.QueueUserWorkItem(callback); Console.Write("waitone2....."); _are.WaitOne(); Console.WriteLine("done."); } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場