换句话说,我有一个线程可以启动并多次调用waitHandle.Set()
。然后我开始几个线程,每个线程都在等WaitHandle
。是否会发出X的信号,其中X是原始线程称为waitHandle.Set()
的次数?
是否有一种结构可以支持我正在努力完成的任务?
答案 0 :(得分:9)
可能,但可能不是。
只能设置或取消设置事件,如果没有任何内容可以取消设置事件,则重复调用Set将不会更改其状态,除非它是自动重置事件并且至少有一个线程在等待它。通过手动重置事件,任何等待(或开始等待)的线程都将被释放,直到某些事件取消设置。
我认为你实际上需要一个信号量,它有一个计数并支持设置 n 次以释放 n 线程(即使其中一些线程只开始等待在设置了一些调用后。)
答案 1 :(得分:3)
取决于EventResetMode
。如果设置为EventResetMode.AutoReset
,它将只释放一个线程。如果是'EventResetMode.ManualReset',它将释放在事件上阻止的所有线程。
Semaphore.Release(Int)
对于Int,计数将是一种方式。
答案 2 :(得分:1)
正如Richard所说,EventWaitHandles只有一个标志,无法计算Set被调用的次数。添加计数变量的简单解决方案会导致竞争条件。
William Kempf有一个article关于计数变量不起作用的原因,以及一个使用.Net Monitor类的解决方案。