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方法);

 

posted @ 2020-10-31 13:00  温故纳新  阅读(327)  评论(0编辑  收藏  举报