なんだかGoodVibes

日々の勉強メモです。

【C#】CountdownEventメモ

本日はCountdownEventについてのメモです。

概要

以前、AutoResetEventについての記事を書きましたが、
CountdownEventもAutoResetEventと同様で
GOを出すまで待機してくれるクラスです。 違いは、AutoResetEventは1回の待機でしたが、
CountdownEventは指定回数の待機が可能であることです。

AutoResetEventについては以下の記事を参照してください。

【C#】AutoResetEventメモ - なんだかGoodVibes


サンプルコード

以下の例では、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.



以上です。