1. ManualResetEvnet
var mevent = new ManualResetEvent(false);
Task.Factory.StartNew(() =>
{
mevent.WaitOne();
MessageBox.Show("Task1");
});
Task.Factory.StartNew(() =>
{
mevent.WaitOne();
MessageBox.Show("Task2");
});
Thread.Sleep(2000);
mevent.Set();
之后 mevent.Set() 把状态设置为true , 此时WaitOne就可以执行完毕。
此时状态一直是true, 只有Reset才变为false。
注意,当 ManualResetEvent Set()后,会使得所有等待的 WaitOne 执行完毕。
上面的代码 Task1 和 Task2 都将继续执行下去
2.AutoResetEvent
他不但可以自动Reset, 而且,当他Set后,自动立刻再次变为 false 状态。
很多地方没有好好说明 什么叫 “立刻” 。我们稍后解释。
var aevent = new AutoResetEvent(false);
Task.Factory.StartNew(() =>
{
aevent.WaitOne();
MessageBox.Show("Task1");
});
Task.Factory.StartNew(() =>
{
aevent.WaitOne();
MessageBox.Show("Task2");
});
Thread.Sleep(2000);
aevent.Set();
上面的代码, 当 aevent.Set() 后 只能
使一个WaitOne完成
一般是 Task1
3. 解释一下 “立刻” 的含义
为什么 ManualResetEvent 可以释放所有的 WaitOne , 而AutoResetEvent 只能释放一个?
我们可以通过以下代码,让 ManualResetEvent也只释放一个 WaitOne , 类似AutoResetEvent
var mevent = new ManualResetEvent(false);
Task.Factory.StartNew(() =>
{
lock (mevent)
{
mevent.WaitOne();
mevent.Reset();
}
MessageBox.Show("Task1");
});
Task.Factory.StartNew(() =>
{
lock (mevent)
{
mevent.WaitOne();
mevent.Reset();
}
MessageBox.Show("Task2");
});
Thread.Sleep(2000);
mevent.Set();
}
上面的代码通过 lock 使得 mevent立刻Reset 达到了 AutoResetEvent 的效果
从这里也可以看到 “立刻” 的含义其实是 在释放完一个 WaitOne(或者没有任何可以释放的对象)后,立刻Reset