2007年01月29日

AutorResetEventによる同期

  
今まで、C#で、AutorResetEventを使ったコードを書いたことがなかったので、
動きを確かめるため、書いてみた。

using System.Threading;
...

private List<AutoResetEvent> areList = new List<AutoResetEvent>();

private void Run() {
for (int i = 0; i < 3; i++) {
AutoResetEvent are = new AutoResetEvent(false);
areList.Add(are);
Thread th = new Thread(Start);
th.Start(are);
}
AutoResetEvent.WaitAll(areList.ToArray());
Console.WriteLine("Thread End");
Console.ReadLine();
}

private Random rnd = new Random();
private void Start(object obj) {
Console.WriteLine("Thread Start");
Thread.Sleep(1000*rnd.Next(1,4));
Console.WriteLine("Thread Stop");
((AutoResetEvent)obj).Set();
}


このコードは、3つのスレッドを起動し、すべてが終わるまで待つというコード。
どれかひとつを待つのならば、WaitAny staticメソッドか、WaitOneメソッドを使えばよい。

WaitOneの場合は、AutoResetEvent のインスタンスはひとつだけでよいので、
コードも簡単だ。(コードは省略)

ManualResetEvent の場合は、Resetをするコードも必要なので、スレッドの終了待ちの
ようなコードは、AutoResetEventの方が楽ですね。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50698606