ManualResetEvent和AutoResetEvent

二者區別:AutoResetEvent.Set()相當於ManualResetEvent.Set()+ManualResetEvent.Reset(),實質上是事件被消費後自動還是手動復位的區別。


下面的代碼可以很容易看出二者的區別,AutoResetEvent在執行一次WaitOne方法後會自動復位成false,而ManualResetEvent則不會自動復位。

static object lo = new object();
AutoResetEvent aa = new AutoResetEvent(false);
for (int i = 0; i < 100; i++)
{
    Thread th = new Thread(new ThreadStart(() => {
        lock (lo)
        {
            aa.Set();
        }
    }));
    th.Start();
}
Thread.Sleep(1000);
aa.WaitOne();
aa.WaitOne();

ManualResetEvent aa = new ManualResetEvent(false);
for (int i = 0; i < 100; i++)
{
    Thread th = new Thread(new ThreadStart(() => {
        lock (lo)
        {
            aa.Set();
        }
    }));
    th.Start();
}
Thread.Sleep(1000);
aa.WaitOne();
aa.WaitOne();

上面的代碼亦可以看出在事件未被監聽到的情況下(即無WaitOne方法調用)AutoResetEvent不管被Set多少次,效果都是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章