您的问题似乎是一种常见的树步行分叉技术。每次递归时,您都会启动另一个并发操作(将其排入线程池等)。但是您需要等待所有子分支最后完成。只需为您启动的每个子操作的倒计时事件添加 1,并在每个子操作结束时发出信号。只要您安排算法,它就不会发出信号,直到它为每个子操作添加之前,它是安全的。
我应该补充一点,您不需要预先知道计数,只需在根处将其设为 1,每次分叉给孩子时,加 1,然后在每个末尾发出信号,它会动态无需前期成本即可处理任何树木。
CountdownEvent 有一个 Add 方法,可让您增加飞行中的计数。
那有意义吗?我可能偏离了你想要完成的目标。
但是,如果您真的想要一个 CountdownEvent 以您指定的方式运行,那么在一个类中包装几个互锁操作来执行您所说的操作非常容易。
但是,CountdownEvent 是轻量级的,如果没有人在发出信号之前等待,它几乎是免费的。在昂贵的情况下,它是最优的,无论有多少任务(等),它只需要让一个内核转换为信号和一个等待,最坏的情况。
要实现您的建议,需要围绕事件的信令和重置进行同步。倒计时事件依赖于一个简单的原则,只有在 Signal 调用中从非零到零的转换才能发出事件信号。不存在竞争,因为一次不可能有多个线程更改值(它是互锁的),因此只能有一个线程尝试向事件对象发出信号(唤醒另一个等待线程)。完美的。
但是,如果您有多个线程设置和重置它,则需要围绕设置和重置同步,因为计数可能会抖动几次,并且多个线程会同时尝试设置或重置事件。(设置、重置和等待事件都是昂贵的,因为它们都必须进行内核转换并导致上下文切换)。除非您围绕某些东西进行同步以保护设置/重置转换,否则它不会起作用。如果他们将其添加到 CountdownEvent 中,它将不再是最佳的,它会更加昂贵。