2009-05-05 39 views

回答

9

也许,但可能不是。

事件只能设置或不设置,如果没有任何事件可以取消设置,那么Set的重复调用不会改变它的状态,除非它是一个自动重置事件,并且至少有一个线程正在等待它。通过手动重置事件,等待(或开始等待)的任何线程将被释放,直到事件被解除。

我想你会真的想要一个信号,它确实有一个计数和支持设置ň次发布ñ线程(即使其中一些线程才开始等待后,一些通话设置)。

+0

是的,我想要一个信号灯。我记得它的机制,但不是名字。自从我为资源池编写低级线程代码已经有一段时间了。 – 2009-05-05 20:23:25

3

这取决于EventResetMode。如果它设置为EventResetMode.AutoReset它只会释放一个线程。如果它是'EventResetMode.ManualReset',但是它会释放在事件上被阻塞的所有线程。

Semaphore.Release(Int) 

其中int是计数会做到这一点一个方式。

+0

有没有办法让它释放X线程,其中X是调用waitHandle.Set()'的次数? – 2009-05-05 20:11:55

+0

是的。将其创建为Auto。你想做什么?如果你能提供更多信息,我相信有更好的方法。正如下面提到的,你也可以使用信号量,但有些东西闻起来很腥。 – 2009-05-05 20:15:37

+0

不,自动重置事件在这里不合适。你依赖于调用Set的线程只调用一次。如果事件在任何线程等待满足之前被设置了两次,那么只有一个等待线程运行。 – 2009-05-05 20:33:45

1

正如Richard所述,EventWaitHandles只有一个标志并且不能计算Set被调用的次数。添加计数变量的简单解决方案会导致竞争条件。

William Kempf有一个article为什么计数变量不起作用,以及使用.Net Monitor类的解决方案。

相关问题