二者區別: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多少次,效果都是一樣的。