我认为这里有点有趣。我有一个类负责将多个处理操作“多路复用”到固定数量的线程上。典型的情况是一种生产者/消费者问题,其中每个操作都包含一个WaitHandle(在这种情况下,是跟踪队列中有多少项的信号量)和一个要调用的委托。
例如,如果我有两个生产者(A和B),则将项目生成两个单独的队列。我没有为每个生产者创建两个消费者线程(A1,A2,B1,B2),而是将四个消费者“线程”复用到两个线程上。这个“多路复用器”的代码运行类似这样的东西(简化了一点):
WaitHandle[] waitHandles = new WaitHandle[2];
waitHandles[0] = NumberOfItemsFullInProducerAQueue;
waitHandles[1] = NumberOfItemsFullInProducerBQueue;
while(true)
{
int index = WaitHandle.WaitAny(waitHandles);
if(index == 0)
{
// handle the item from queue A
}
else
{
// handle the item from queue B
}
}
我正在尝试将此概念扩展到稍微复杂的示例,其中一个操作可能需要在执行之前满足多个等待句柄。我想知道是否有某种WaitHandle.Combine(waitHandle1,waitHandle2)调用我可以将两个等待句柄组合成一个等待句柄。最终结果将是:
A,B,C,D are waitHandles
E = Combine(A, B)
F = Combine(C, D)
waitHandles = { E, F }
while(true)
{
int index = WaitHandle.WaitAny(waitHandles);
if(index == 0)
{
}
else
{
}
}
加分?
虽然不是必需的,但如果等待句柄的组合可以相交,那么它也可能非常好。例如,像这样:
A,B,C are waitHandles
D = Combine(A, B)
E = Combine(A, C)
waitHandles = { D, E }
// same as above from here
感谢您的帮助SO
答案 0 :(得分:1)
您可以考虑查看.NET 4 TPL中的新Barrier类(作为Reactive Extensions的一部分后端移植到3.5。它专门针对您描述的场景而设计,您需要在哪里阻止执行,直到多个协作任务到达检查点。您还可以使用任务系统创建复杂的延续路径,其中一个任务取决于前两个完成,取决于第一个任务完成,如果异常发生在任何点,则具有这些例外情况汇总并在中心位置报告。