本日はCountdownEventについてのメモです。
概要
以前、AutoResetEventについての記事を書きましたが、
CountdownEventもAutoResetEventと同様で
GOを出すまで待機してくれるクラスです。
違いは、AutoResetEventは1回の待機でしたが、
CountdownEventは指定回数の待機が可能であることです。
AutoResetEventについては以下の記事を参照してください。
サンプルコード
以下の例では、3つのスレッドを用意しています。
この3つのスレッド内でデクリメントして0になるまで待機します。
CountdownEventのコンストラクタの引数に
カウント数を指定します。
var signal = new CountdownEvent(3); var t1 = new Thread(() => { Thread.Sleep(TimeSpan.FromMilliseconds(500)); signal.Signal(); Console.WriteLine("Thread1 Done."); }); var t2 = new Thread(() => { Thread.Sleep(TimeSpan.FromMilliseconds(750)); signal.Signal(); Console.WriteLine("Thread2 Done."); }); var t3 = new Thread(() => { Thread.Sleep(TimeSpan.FromMilliseconds(1000)); signal.Signal(); Console.WriteLine("Thread3 Done."); }); t1.Start(); t2.Start(); t3.Start(); signal.Wait(); Console.WriteLine("Done!");
実行結果は以下のようになります。
Thread1 Done. Thread2 Done. Thread3 Done. Done!
カウントが0の状態で.Signal()を実行すると
例外が発生するので注意してください。
var signal = new CountdownEvent(1); signal.Signal(); try { signal.Signal(); } catch (Exception ex) { Console.WriteLine($"ERROR -> {ex.Message}"); } signal.Wait();
ERROR -> Invalid attempt made to decrement the event's count below zero.
以上です。