一:ManualResetEvent类
[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true,
ExternalThreading = true)]
public sealed class ManualResetEvent : EventWaitHandle
msdn定义:通知一个或多个正在等待的线程已发生事件。
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
ManualResetEvent 也可以同 staticWaitAll 和 WaitAny 方法一起使用。
Reset |
将事件状态设置为非终止状态,导致线程阻止。 (继承自 EventWaitHandle。) |
Set |
将事件状态设置为终止状态,允许一个或多个等待线程继续。 (继承自 EventWaitHandle。) |
WaitOne() |
阻止当前线程,直到当前 WaitHandle 收到信号。 (继承自 WaitHandle。) |
二:AutoResetEvent类
[ComVisibleAttribute(true)]
public sealed class AutoResetEvent : EventWaitHandle
msdn定义:通知正在等待的线程已发生事件。无法继承此类。
AutoResetEvent 使线程可以通过发信号来互相通信。通常,此通信涉及线程需要独占访问的资源。
线程通过对 AutoResetEvent 调用 WaitOne 方法来等待信号。如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 方法来通知资源可用。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
如果当 AutoResetEvent 为终止状态时线程调用 WaitOne,则线程不会被阻止。AutoResetEvent 将立即释放线程并返回到非终止状态。
![]() |
---|
不能保证对 Set 方法的每次调用都释放线程。如果两次调用十分接近,以致在线程释放之前便已发生第二次调用,则只释放一个线程。就像第二次调用并未发生一样。另外,如果在调用 Set 时不存在等待的线程且 AutoResetEvent 已终止,则该调用无效。 |
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态:如果初始状态为终止状态,则为 true;否则为 false。
AutoResetEvent 也可以同 staticWaitAll 和 WaitAny 方法一起使用。
有关线程同步机制的更多信息,请参见概念文档中的 EventWaitHandle、AutoResetEvent 和 ManualResetEvent 和同步基元。
AutoResetEvent和ManualResetEvent这两个类经常用到,他们的用法很类似,但也有区别的:
autoevent.WaitOne()每次只允许一个线程进入,当某个线程得到信号(也就是有其他线程调用了autoevent.Set()方法后)后,autoevent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,autoevent一次只唤醒一个线程
而manualevent则可以唤醒多个线程,因为当某个线程调用了set方法后,其他调用waitone的线程获得信号得以继续执行,而manualevent不会自动将信号置为不发送.也就是说,除非手工调用了anualevent.Reset().方法,则manualevent将一 直保持有信号状态,manualevent也就可以同时唤醒多个线程继续执行