いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-014 (System.Threading.AutoResetEvent)


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.");
        }
    }
}

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。