ManualResetEvent是C#中的一个线程同步原语,用于在多线程环境下进行线程间的同步与通信。以下是对ManualResetEvent的用法总结:
ManualResetEvent mre = new ManualResetEvent(false);
可以通过构造函数指定初始状态,false表示事件为非终止状态,true表示事件为终止状态。
mre.WaitOne();
当事件为非终止状态时,调用WaitOne方法会使当前线程阻塞,直到事件被其他线程设置为终止状态。
mre.Set();
调用Set方法将事件设置为终止状态,所有阻塞在WaitOne方法上的线程将被唤醒继续执行。
mre.Reset();
调用Reset方法将事件重置为非终止状态,以便后续的WaitOne方法可以再次阻塞线程。
mre.WaitOne(timeout);
可以通过WaitOne方法的重载形式指定超时时间,如果在超时时间内事件仍未发生,WaitOne方法会返回false。
bool signaled = mre.WaitOne(0);
可以通过WaitOne方法的重载形式指定超时时间为0,此时WaitOne方法会立即返回,返回值表示事件的当前状态。
WaitHandle.WaitAll(handles); // 等待所有事件都发生
WaitHandle.WaitAny(handles); // 等待任意一个事件发生
可以通过WaitHandle的静态方法WaitAll和WaitAny来等待多个事件的发生。
需要注意的是,ManualResetEvent是一个信号量,它只能由其他线程设置为终止状态,而不能自动恢复为非终止状态。如果需要自动恢复为非终止状态,可以考虑使用AutoResetEvent。