C# 线程同步 AutoResetEvent和ManualResetEventSlim
如果多个线程使用同一个AutoResetEvent或者ManualResetEventSlim实例,则可以使用AutoResetEvent和ManualResetEventSlim来实现线程同步;
1 AutoResetEvent
1.1 构造方法 new AutoResetEvent(bool)
true:初始状态设置为终止,此时为有信号,意味着此时线程A调用AutoResetEvent实例的WaitOne()方法不会被阻止运行;
false:初始状态设置为非终止,此时为无信号状态,意味着此时线程A调用AutoResetEvent实例的WaitOne()方会被阻止,等待有信号继续运行;
1.2 Set方法
AutoResetEvent实例的Set()方法会将该AutoResetEvent实例的事件状态设置为有信号,从而允许一个等待线程(该线程正在等待该AutoResetEnvent实例有信号)继续运行,然后重置事件状态为无信号,阻止其他等待该AutoResetEvent实例为有信号的线程继续运行;类似于闸门只开一次,只允许一个人(一个线程)通过,有人通过后自动关闸,其他人只能再次等待该闸门打开;
注意:不保证每次调用Set方法都将释放一个线程。 如果两次调用都过于接近,因此在释放线程之前发生第二次调用,则只释放一个线程。 这就像第二次调用没有发生。
1.3 Reset方法
将该AutoResetEvent实例设置为无信号,阻止其他等待该AutoResetEvent实例为有信号的线程继续运行;
1.4 WaitOne方法
如果线程调用了AutoResetEvent实例的WaitOne()方法,意味着如果该实例为无信号状态,则该线程WaitOne()后面的语句将被阻止运行,直到该AutoResetEvent实例为有信号才会继续运行;如果该实例一开始就是有信号状态,则线程调用WaitOne()后面的语句将不会被阻止运行;
2 ManualResetEventSlim
构造方法 new ManualResetEventSlim(bool)类似AutoResetEvent构造方法
ManualResetEventSlim实例的Set()会将该ManualResetEventSlim实例的事件状态设置为有信号,从而允许所有的等待线程(该线程正在等待该实例为有信号)继续运行,
同AutoResetEvent不同的是,一旦该ManualResetEventSlim实例调用Set方法为有信号后,就一直为有信号,除非手动调用Reset方法重置为无信号状态才会阻止那些等待该ManualResetEventSlim实例为有信号的线程(即线程使用了该ManualResetEventSlim实例的Wait方法);